如何将ajax放入循环中?

时间:2013-10-09 06:55:19

标签: jquery ajax

我在循环内的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”。最后一个是我希望分裂的那个。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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]未定义为价值

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

答案 2 :(得分: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);

}