如何在循环中将元素传递给jQuery post函数

4

我有以下代码:

for (_field in _fields) {
    $.post(
        '/api/fields',
        { id: _field.id },
        function(data, _field) {
            alert(data);
        } (data, _fields[_field)
    );
}

我必须将_fields[_field]元素传递给从jQuery返回数据的函数,因为在循环过程中会丢失对正确对象的引用。问题在于,在定义post函数应该具有_field参数时,您还必须指定数据参数,否则数据将被_field覆盖。

当前数据返回为undefined,因为我在循环内没有定义数据对象。我还尝试传入null,但这也只返回null。我正在寻找一种方法来传递元素,而不会覆盖从post函数返回的数据。

是否有任何方法可以解决这个问题,或者可能有一种替代的jQuery方法可以完成所需的操作?

1个回答

7
你需要一个函数工厂函数 - 一个创建函数的函数:
for (_fieldName in _fields) {
    $.post('/api/fields',
    {
        // Unrelated, but I think this bit is wrong; shouldn't it be
        // `id: _fields[_fieldName].id` ? You're trying to use `.id` on
        // a string -- see below for a full update
        id: _fieldName.id
    },
    makeHandler(_fields[_fieldName])
    );
}
function makeHandler(field) {
    return function(data) {
        // Use `data` and `field` here
    };
}

请注意,在我们传递到$.post的对象初始化器中,我们正在调用makeHandler使其运行并返回函数,然后我们将该函数传递到$.post中。当$.post完成时,将调用该函数,并可以访问data参数和makeHandlerfield参数,因为它是对makeHandler调用上下文的闭包,其中包括field参数。更多信息:Closures are not complicated
请注意,在上面的代码中,我将您的变量_field更改为_fieldName以更清晰地表达:在for..in循环中,变量是一个字符串,即属性的名称。请参见注释,我认为您尝试在错误的位置使用.id。以下是我认为您真正想要的内容:
for (_fieldName in _fields) {
    _field = _fields[_fieldName];
    $.post('/api/fields',
    {
        id: _field.id
    },
    makeHandler(_field)
    );
}
function makeHandler(field) {
    return function(data) {
        // Use `data` and `field` here
    };
}

请注意,如果_fields是一个数组,则不应该在没有保护措施的情况下使用for..in。更多信息请参见:Myths and realities of for..in


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接