Como colocar o ajax dentro de um loop?

Eu tenho um pedido de ajax dentro de um pedido de ajax que está dentro de um loop. Aqui está:

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(); }); } }); } 

colocando async: false não funciona. Como contornar isso? O que eu quero é que todo loop do ajax interno receba a variável certa i . O que acontece no meu código é que o ajax interior sempre recebe o último i .

Nota: variável input_files é uma matriz contendo ids, exemplo “my_id_number_9”. Esse 9 no último é o que eu quero entrar na divisão.

Use o closure para passar o valor correto de 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); } 

O problema é o uso da variável de fechamento i dentro de um método de retorno de chamada asynchronous.

Como input_files é um array, você pode consertá-lo facilmente usando $ .each () para iterar

 $.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(); }); } }); }) 

O problema … dentro do método de retorno de chamada do ajax, a variável i é usada, que é declarada no escopo de fechamento externo, de modo que todos os methods de retorno de chamada do pedido ajax compartilham a mesma instância de i . Agora, o que acontece é que, uma vez que a requisição é assíncrona, o loop é finalizado antes que o callback seja executado, então quando os callbacks forem executados, i serei igual a input_files que resultará em input_files[idx] dando indefinido como o valor

A solução proposta criará um fechamento privado para cada iteração do loop, o que preservará os valores da variável declarada no fechamento de serem modificados em outros loops.

Tente a function de fechamento

 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); }