2016-04-27 6 views
1

Wie kann man eine for Schleife erstellen, die darauf wartet, dass ein asynchroner Aufruf abgeschlossen wird, bevor eine neue Iteration einer Schleife OHNE eine Bibliothek (wie jQuery) gestartet wird?Eine FOR-Schleife warten WITHOUT eine Bibliothek in JS

Beispiel:

var items = [1,2,3,4,5]; 
 

 
for (var i = 0; i < items.length; i++) { 
 

 
    var promise = new Promise(function(resolve, reject){ 
 
     asyncAPIcall({ 
 
      body : item[i] 
 
     }, function(error, response){ 
 
      if(error) { 
 
       reject(); 
 
      } else { 
 
       resolve(); 
 
      } 
 
     }); 
 

 
    promise.then(function() { 
 
      //continue loop 
 
     }, function() { 
 
      //break loop 
 
     }); 
 

 
}

Dank


UPDATE (4/29)

I dieser Lösung gedacht, wo ich eine Funktion erstellen th bei Anrufen selbst:

var items = [1,2,3,4,5]; 
 

 
var counter = items.length - 1; //minus one since array is zero based. 
 

 
function myLoop(){ 
 

 
    asyncAPIcall({ 
 
     body : item[counter] 
 
    }, function(error, response){ 
 
     if(error) { 
 
      // Error message. 
 
     } else { 
 
      counter = counter - 1; 
 
      if(counter == -1){ 
 
       //Done 
 
      } 
 
      else { 
 
       myLoop(); 
 
      } 
 
     } 
 
    }); 
 

 
}

+0

Sie können nicht. Was musst du wirklich tun? – Amit

+0

Eine For-Schleife ist synchron. Es kann niemals auf eine asynchrone Operation warten. Sie können jedoch eine Warteschlange oder etwas Ähnliches haben. –

+0

@Amit Ich muss eine lange Reihe von API-Aufrufe auslösen und wenn einer fehlschlägt, stoppe die Kette von zusätzlichen Anrufen. Ich interagiere mit einer API, die nur ein Objekt gleichzeitig akzeptiert, also muss ich es 20 Mal drücken, um alle meine Objekte zu senden. –

Antwort

3

können Sie verwenden, reduzieren sie Prozess nacheinander (oder eingerichtet, um die Versprechen Kette mit einem normalen for-Schleife - ziehe ich reduzieren, selbst) zu machen.

Dies kann mehr sein, als Sie benötigen, wenn Sie die Ergebnisse dieser vielversprechenden Auflösungen nicht wirklich erfassen müssen. Beachten Sie auch, dass Sie am Ende immer noch ein Versprechen haben, das ein Array der Ergebnisse der einzelnen Versprechen enthält, die ihrer ursprünglichen Array-Position entsprechen.

Auch hier ist eine verspottete Version der asyncAPIcall, die dabei helfen sollte, die Reihenfolge der Operationen hier zu zeigen, wenn Sie durch wie/wo die Methoden aufgerufen werden sollen.

function asyncAPIcall(obj) { 
    console.log('asyncAPIcall for:', obj); 
    return new Promise((resolve) => { 
     setTimeout(() => { 
      let resolution = obj.body + 5; // change the value in some way, just to show that input !== output 
      console.log('resolving with:', resolution); 
      return resolve(resolution); 
     }, 100); 
    }); 
} 
+1

Ich werde es versuchen. Danke für die Empfehlung! –

+0

Viel Glück! Wenn Sie die Ergebnisse am Ende nicht benötigen, können viele Array-Shenanigans vollständig verschwinden. Wenn Sie brauchen, kann ich eine einfachere Version hinzufügen, die sich nicht um die Ergebnisse kümmert. – dvlsg