如何将一个元素传递给循环中的jQuery帖子

Mr.*_*ith 4 javascript jquery post loops

我有以下代码:

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

我必须将_fields[_field]元素传递给从jQuery返回数据的函数,因为在循环期间丢失了对正确对象的引用.问题是,在定义post函数应该有一个_field参数时,您还必须为数据指定一个参数,否则数据将被覆盖_field.

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

有没有办法解决这个问题,或者是否有一种替代的jQuery方法可以满足需要?

T.J*_*der 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
    };
}
Run Code Online (Sandbox Code Playgroud)

请注意,在我们传入的对象初始值设定项中$.post,我们调用 makeHandler它运行并返回我们将传入的函数$.post.然后,该函数被调用时$.post完成,并已获得了data这样的说法$.post给它还有field一个参数makeHandler,因为它是一个封闭在呼吁的背景下makeHandler,包括field说法.更多:关闭并不复杂


请注意,在上面的代码,我改变了你的变量_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
    };
}
Run Code Online (Sandbox Code Playgroud)

另请注意,如果_fields是数组,则不应for..in在没有安全措施的情况下使用它.更多:神话和现实for..in