2016-11-10 3 views
1

Also, ich habe Funktion, die wie folgt verriegelt:Warten Sie async .done() in jeder Iteration der Schleife

function getMainData() { 
    var dfd = $.Deferred(); 

    $.getJSON('My string that i pass', 
     function(result) { 
      if (result !== undefined) { 
       dfd.resolve(result); 
      } 
     }) 

    return dfd.promise() 
} 

function getSpecificData() { 
    var dfd = $.Deferred(); 

    var myArray = []; 

    for (var i = 0; i < 5; i++) { 
     getMainData().done(function(result) { 
      myArray.push(result) 

      dfd.resolve(myArray) //This is where I am lost. 
     }) 
    } 

    return dfd.promise() 
} 

getSpecificData().done(function(result) { 
    console.log(result); 
}) 

Ich glaube, ich weiß, wie Versprechungen arbeiten, wenn Sie sie zusammen Kette, aber ich kann nicht das machen for-loop wartet darauf, dass der asynchrone Aufruf vor der nächsten Iteration beendet wird.

Können mir einige bitte helfen?

Antwort

2

Eine for-Schleife hat keine Möglichkeit, die nächste Iteration zu verzögern, um auf asynchronen Code zu warten.

Sie können es lösen eine Funktion, indem Sie die rekursiv statt

function getMainData() { 
    return $.getJSON('My string that i pass'); 
} 

function getSpecificData() { 
    var myArray = [], def = new $.Deferred(); 

    (function rec(i) { 
     getMainData().done(function(result) { 
      myArray.push(result); 
      if (i < 5 && result !== undefined) { 
       console.log(i) 
       rec(++i); 
      } else { 
       def.resolve(myArray); 
      } 
     }); 
    })(0); 

    return def.promise(); 
} 

getSpecificData().done(function(result) { 
    console.log(result); 
}); 
+0

Dank für die Lösung, das hat gut funktioniert, und ich habe eigentlich nicht über rekursive Methoden gedacht. – Zorken17

0

Haben Sie versucht, ohne promise wie:

var myArray = []; 
var cpt=0; 
var total=5; 

getMainData(); 
console.log(myArray); 

function getMainData() 
{ 
    $.getJSON('My string that i pass', function(result) { 
     if(cpt<total) 
     { 
      myArray.push(result); 
      cpt++; 

      getMainData(); 
     } 
    }) 
} 

Hoffnung, das hilft.

1

Sie sollten stattdessen alle Versprechen in ein Array pushen und darauf warten, dass alle fertig sind.

function getMainData() { 
    return $.getJSON('My string that i pass'); 
} 

function getSpecificData() { 
    var promiseArray = []; 

    for (var i = 0; i < 5; i++) { 
     promiseArray.push(getMainData()); 
    } 

    return $.when.apply($, promiseArray); 
} 

getSpecificData().done(function(result) { 
    console.log(result); 
}) 
+0

Danke für eine schöne Lösung genannt wird, aber das funktioniert nicht wie beabsichtigt. Ich bekomme keine Werte von allen meinen asynchronen Anrufen. Das bedeutet, dass die Schleife nicht auf den Async-Aufruf wartet. – Zorken17

+0

@ Zorken17 Sie können Argumente Variable verwenden, um vollständige Return-Liste anstelle der Ergebnisvariable –

Verwandte Themen