2

我有许多从 for 循环发送的 AJAX 请求,并且希望根据循环中的位置将一些数据发送到回调函数。

当我尝试为每个请求附加一个函数时,它们似乎都从上次调用中获取数据,例如,

for(var i=0; i < 4; i++){
    data = ... //some unique data
    req = $.post('/update/add', data, function(r_data, textStatus, jqxhr){
        console.log(data);
    }, "json")
}

会给我来自 i = 3 条目的数据,而不是 4 个不同的条目。如何将这些数据传递给回调函数?

谢谢你们...

4

1 回答 1

3

问题是,当在i变量上创建闭包时,它引用同一个变量而不是创建一个新i变量。为避免这种不良影响,您可以执行以下操作。

for(var i=0; i < 4; i++){
    data = ... //some unique data
    req = $.post('/update/add', data, (function (i) {
        //return a new callback function
        return function (r_data, textStatus, jqxhr) { 
            //callback logic
            //i will be the right index now
        };
    })(i), "json");
}

在上面的示例中,我们将回调函数包装在一个自执行函数中,该函数正在传递循环的i值。由于i变量是在自执行函数的范围内定义的,我们现在可以安全地返回一个新的回调函数,它将i在自执行函数的变量上创建一个闭包,而不是i在循环中使用的变量。

注意:为了优化您的代码,您可以避免每次都创建一个新的自执行函数。

function createCallback(i) {
     return function (r_data, textStatus, jqxhr) {
         console.log(i);
     };
}

/*
    loop
        post(..., createCallback(i));
 */
于 2013-04-08T00:15:19.933 回答