2

我在循环内的 ajax 请求中有一个 ajax 请求。这里是:

for (var i = 0; i < input_files.length; i++) {
 $.ajaxFileUpload({
  url : dasdasdsa,
  success : function () {
    $.ajax({
    var get_the_number_in_the_last_of_array = input_files[i].split('_').pop();
    });
  }
 });

}

async: false不工作。如何解决这个问题?我想要的是内部 ajax 的每个循环都得到正确的变量i。在我的代码中发生的是内部 ajax 总是得到最后一个i.

注意:变量input_files是一个包含 id 的数组,例如“my_id_number_9”。最后的 9 是我想在分裂中得到的。

4

3 回答 3

4

用于closure传递正确的值i-

for (var i = 0; i < input_files.length; i++) {

    (function (index) {
        $.ajaxFileUpload({
            url : dasdasdsa,
            success : function () {

                $.ajax({
                    var get_the_number_in_the_last_of_array = input_files[index]
                        .split('_').pop();
                });
            }
        });
    })(i);
}
于 2013-10-09T06:57:16.700 回答
2

i问题是在异步回调方法中使用闭包变量。

由于input_files是一个数组,您可以使用 $.each() 轻松修复它进行迭代

$.each(input_files, function (idx, file) {
    $.ajaxFileUpload({
        url: dasdasdsa,
        success: function () {
            $.ajax({
                var get_the_number_in_the_last_of_array = file.split('_').pop();
                //or var get_the_number_in_the_last_of_array = input_files[idx].split('_').pop();
            });
        }
    });
})

问题...在 ajax 回调方法i中使用了在外部闭包范围中声明的变量,因此所有 ajax 请求回调方法共享相同的i. 现在发生的情况是,由于请求是异步的,因此循环在执行回调之前完成,因此执行回调时i将等于input_files这将导致input_files[idx]给出 undefined 作为值

提议的解决方案将为循环的每次迭代创建一个私有闭包,该闭包将保留闭包内声明的变量值,以免被其他循环修改。

于 2013-10-09T06:57:54.800 回答
0

试试闭包函数

for (var i = 0; i < input_files.length; i++) {
(function(i)
{
 $.ajaxFileUpload({
  url : dasdasdsa,
  success : function () {
    $.ajax({
    var get_the_number_in_the_last_of_array = input_files[i].split('_').pop();
    });
  }
 });
})(i);

}
于 2013-10-09T07:03:44.573 回答