如何将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总是得到最后一个。
注意:变量input_files
是一个包含id的数组,例如“my_id_number_9”。 最后一个9是我想要的分裂。
使用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); }
问题是在异步回调方法中使用闭包变量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作为值
所提出的解决方案将为循环的每次迭代创建一个私有闭包,这将保留在闭包内声明的变量的值,而不是修改其他循环。
尝试关闭function
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); }