Javascript loop and jquery get

Salut, nu am cunostinte destule in javascript,or in jquery, si incerc sa dezvolt un script.
El va trebui sa-mi faca un loop din array, si la fiecare rezultat sa-mi faca un get cu jquery la o pagina, si sa treaca la urmatoarea,doar daca cererea curenta s-a efectuat.
Mai jos este codul meu, insa este gresit pentru aceasta varianta.

var list = ['<?=implode("', '", $list)?>'];
for (var i = 0; i < list.length; i++)
{
    
    $.get("save.php?file="+list[i], function(data)
    {
       //am facu prima cerere, va trebui sa trec la urmatoarea, dar cum ?
    });
} 

Ma poate ajuta cineva?Multumesc !

Pentru că AJAX este asincron, nu merge cum încerci tu.

Apoi, dacă list va avea mai mult de 4-6 elemente, va dura ceva până vor fi iterate toate (browserele suportă 4-6 conexiuni simultane). Cea mai bună chestie ce o poți face ar fi să modifici save.php astfel încât să accepte toate elementele dintr-un foc.

Dar dacă vrei musai să mergi pe calea asta:

var currentIterator = 0;

function iterateOverAjax() {
  $.get( 'save.php', { file : currentIterator }, saveCallback );
  currentIterator++
}

function saveCallback(data) {
  if( currentIterator < list.length ){
    iterateOverAjax();
  }
  // parse data.
}

iterateOverAjax();

Sau te poti folosi de deferred objects returnate de catre jquery cand folosesti ajax requesturi. Codul ar trebui sa fie de forma: (nu l-am testat inca)

var x = [];
for (var i = 0; i < 3; i++){
x.push($.get('https://randomuser.me/api/'))
};
$.when.apply($, x).done(function() {
   for (var i = 0; i < arguments.length; i++) {
      //arguments[i] is the return of the singular done() statement
       console.log("Show",arguments[i]);
   }
}).fail(function(){
alert("Failed");
});
2 Likes

E și asta o soluție, dar cred că-i mai complexă decât ar fi necesar :smiley:

pe naiba, ca am maxim 50 de get-uri de facut, defapt sa explic despre ce e vorba.
save.php descarca un mp3 dupa net si-l salveaza pe localhost, de aceea nu-mi permit sa le fac dintr-un foc.
si ma gandeam ca atunci cand se salveaza unul din array, sa mearga mai departe, si bineinteles ca doream sa afisez intr-un div un text care sa spuna ce fisier proceseaza.

acum ma gandesc ca daca as pune un raspuns in save.php , de genul success, si sa-l citeasca functia mea de get, sa reia cu urmatorul…acum imi veni ideea, si-ar trebui cam asa: (teoretic, nimic sigur)

 if(data=='success')
{
continua cu urmatorul get;
}

Dar de unde naiba sa iau pe urmatorul, asta excluzand loop-ul oarecum,cumva…sunt in ceata rau.

@bystefu; vezi codul meu. E normal sa faci asincron call-urile, pentru ca e respectivul job dureaza

Descurca-ma putin te rog, ca nu cunosc:

var x = []; // o sa-l populez cu valorile array-ului meu?
console.log(“Show”,arguments[i]); //aceasta functie o sa-mi afiseze vreun rezultat,ceva?

MS !

e posibil sa fi inteles gresit ce vrei tu. Tu vrei din browser se le pui in sir indian (adica unul dupa altul?). De ce nu trimiti toate request-urile direct catre server?

Daca le vrei insiruite din client, atunci solutia @iamntz este cea corect.

In ceea ce priveste solutia mea, in x puneai rezultat-ul functiei de call ajax din jquery (pe care poti avea collback-uri cand e gata sau cand da failed) si nu contentul rezultat din request-ul httml.

console.log - o sa iti afiseze content cand toate joburile sunt done.

Multumesc frumos, intr-adevar, vad ca aceasta este metoda care-ar trebui s-o folosesc. Cum spuneam mai sus, n-am cunostintele necesare pt asa ceva, insa uite ce-am reusit sa fac eu:

function iterateOverAjax()
{
    var link;
    $("p").append('se proceseaza '+ list[currentIterator]  + "<br />");
    $.get(link , { file : currentIterator, id: list[currentIterator] }, saveCallback );
    currentIterator++
}

am populat un tag p, sa vad pe unde se afla functia mea, totul merge ok. Insa acum nu stiu cum sa iau raspunsul primit de la get, pentru a ma putea folosi de el.Cum eram eu obisnuit:

$.get("save.php", function(data)
    {
    $("p").append(data);
    });

În exemplul meu ai saveCallback. Te-ai uitat ce face? :slight_smile:

da, am vazut acum ca defapt imi returneaza rezultatul :smiley: . // merg mai departe, sper sa nu ma mai impotmolesc.

Multumesc frumos, a functionat bine. Am ajuns in ultima faza a proiectului, insa bineinteles ca trea’ sa fie ceva.Ideea este ca daca dureaza mult, pe save.php, sau nu stiu cum naiba se-ntampla, ca imi cam sare direct la 5 sau 6. Si observ ca dureaza putin pana imi returneaza rezultatul, apoi o ia mai repede dupa 5.
Am incercat sa pun done, sa-mi ca iteratorul sa creasca doar daca s-a procesat, dar nu s-a schimbat nimic.

function iterateOverAjax() {
  $.get( 'save.php', { file : currentIterator }, saveCallback ).done(function( data )
{
  currentIterator++
 });
}

Dupa aceea am crezut ca pana mi se incarca pagina,el poate face niste executii, asa ca am incercat si varianta:

$( document ).ready(function() {iterateOverAjax();});

Eu nu înțeleg o chestie: dacă ai acces și la save.php, de ce nu trimiți toate datele dintr-un foc? Durează mai puțin, ai mai puține probleme…

    $.get( 'save.php', { files : list }, saveCallback);