Looping através de matriz com retorno de chamada

Eu estou tentando executar através de uma matriz enviar para um arquivo php e em um retorno de chamada enviar o próximo valor depois que o php concluiu seu download. Aqui o que eu tenho até agora.

minha matriz vem da seguinte maneira.

["http://example.com/test1.zip", "http://example.com/test2.zip", "http://example.com/test3.zip", "http://example.com/test4.zip", "http://example.com/test5.zip"] 

acima é a saída do console.log (valores); abaixo. ele pega alguns URLs dos valores da checkbox de seleção.

 $('.geturls').live('click',function(){ var values = new Array(); $.each($("input[name='downloadQue[]']:checked"), function() { values.push($(this).val()); ajaxRequest($(this).val(),function(response){ console.log(response); }); }); console.log(values); return false; }); 

Isso chama uma function ajax na qual estou tentando fazer um retorno de chamada.

 function ajaxRequest(urlSend,callback){ var send = { url: urlSend } $.ajax({ type: "POST", url: "index.php/upload", data: send, //dataType: "json", //timeout: 8000, beforeSend: function() { }, success: function(response) { callback('added'); }, error: function (response) { callback('false'); } }); } 

Isso irá enviar para um arquivo php.

 function upload(){ $output = shell_exec("wget {$_POST['url']} 2>&1"); return true; } 

O que eu estou tentando fazer é após o retorno de chamada de uma url que ele baixou completamente, em seguida, pegue o próximo valor da matriz e baixe essa url e assim por diante até que todos os urls da matriz sejam baixados completamente.

no momento, apenas faz o download do primeiro valor e, em seguida, falha porque não reinicia o loop depois que um valor de retorno true é retornado.

Espero que isso faça sentido para alguém apenas procurando por alguma ajuda sobre a melhor maneira de percorrer uma matriz de valores com um retorno de chamada depois de concluído.

Pode ser essa estrutura pode ajudá-lo. Nesta variante, você irá para o próximo URL somente após a conclusão bem-sucedida da chamada anterior do Ajax.

  var arr = ['url0','url1','url2','url3']; var index = 0; function Run(){ DoAjax(arr[index]); } function Next( ){ if(arr.count = index-1) { index =0; return; }else{ DoAjax(arr[index ]); } } function DoAjax(url){ $.ajax({ type: "POST", url: url, data: send, beforeSend: function() { }, success: function(response) { index ++; Next(); // Addition logic if needed }, error: function (response) { } }); } Run() 

Agora que tenho um pouco mais de tempo, achei que seria bom mostrar uma alternativa que aproveitasse o fato de que o jquery ajax agora é implementado como diferido. Significa que você pode usar encadeamento de tubos para fazer todo o trabalho para você. Também eliminei os retornos de chamada tirando proveito do comportamento diferido.

Isso deve lhe dar a ideia.

 // Use jquery deferred pipe chaining to force // async functions to run sequentially var dfd = $.Deferred(), dfdNext = dfd, x, values = [], // The important thing to understand here is that // you are returning the value of $.ajax to the caller. // The caller will then get the promise from the deferred. ajaxRequest = function (urlSend) { var send = { url: urlSend } return $.ajax({ type: "POST", url: "index.php/upload", data: send, }); }; // Starts things running. You should be able to put this anywhere // in the script, including at the end and the code will work the same. dfd.resolve(); // Deferred pipe chaining. This is the main part of the logic. // What you want to note here is that a new ajax call will // not start until the previous // ajax call is completely finished. // Also note that we've moved the code that would // normally be in the callback. // Finally notice how we are chaining the pipes by // replacing dfdNext with the return value from the // current pipe. for (x = 1; x <= 4; x++) { values.push(x); dfdNext = dfdNext.pipe(function () { var value = values.shift(); return requestAjax(value). done(function(response) { // Code here that you would have // put in your callback. console.log(response); }). fail(function(response) { console.log(response); }; }); } 

Exemplo de trabalho que você pode jogar no jsFiddle .