2016-10-25 3 views
1

Ich habe verkettbare Versprechen, die in einer einzigen Serie funktionieren, aber jetzt möchte ich diese serios der Kette innerhalb for Schleife nennen, aber es funktioniert nicht wie erwartet.Verkettet Versprechen in For-Schleife wird nicht ordnungsgemäß ausgeführt

siehe meine demo plunker und sehen Sie die Ausgabe in der Konsole.

unten ist die Struktur meiner Verkettung verspricht. Ich möchte alle publicIP, die von funTwo zurückgegeben wird; aber ich möchte funThree() abschließen und dann alle publicIP erhalten möchten. Wie ich weiß, macht $q.when() einen Wert in Versprechen Objekt.

aber Sie können die console.log('pA', promiseArray); sehr vor ausgeführt sehen und console.log('res three'); und warum successHandler und finally vorher genannt?

hier sicher bin ich etwas fehlt, ein return; in der richtigen Stelle zu schreiben, mich freundlich kann helfen, wie alle Funktion in der for-Schleife ausgeführt und das Rück ein Datenfeld nach, dass für Schleifenenden, die in successHandler erneut versucht werden kann

MyService.funZero() 
    .then(function(response) { 
     console.log(response); 
     var promiseArray = []; 
     for(var i = 0; i < 2 ; i++) { 
      console.log('I', i); 
      MyService.funOne() 
      .then(MyService.funTwo) 
      .then(function(res2) { 
       console.log('res two', res2); 
       publicIP = res2.ip; 
       console.log('i', publicIP); 
       promiseArray.push({'ip': publicIP}); 
       return MyService.funThree(publicIP); 
      }) 
      .then(function() { 
       console.log('res three'); 
      }) 
      } // for loop ends 
     console.log('pA', promiseArray); 
     return $q.when(promiseArray); 
     }) 
     .then(function(res4){ 
      console.log('after for loop', res4); 
     }) 
     .then(successHandler) 
     .catch(errorHandler) 
     .finally(final, notify); 
+0

Mögliches Duplikat [JavaScript-Verschluss Innenschleifen - einfaches praktisches Beispiel] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple- praktisches Beispiel) – Phil

+0

das ist kein Duplikat @Phil .. Ich habe das schon gelesen, aber habe nicht gelernt, wie man es in angularJS anwendet. –

+0

Sie haben Recht, ich entschuldige mich. – Phil

Antwort

2

Also, ich bin nicht genau sicher, was MyService.funThree tut, aber Sie können ein Array über ipArray.push({'ip': publicIP}) und zurück, dass aggregieren zum MyService.funThree und dann die nachfolgende Funktion. Das Problem hier ist, gibt es keine Garantie für die Bestellung in der ipArray, wenn das ist, was Sie suchen. Hier ist der mittlere Abschnitt dieser Funktion:

ipArray = []; 
for(var i = 0; i < 2 ; i++) { 
    console.log('I', i); 
    var promise = MyService.funOne() 
    .then(MyService.funTwo) 
    .then(function(res2) { 
     console.log('res two', res2); 
     publicIP = res2.ip; 
     console.log('i', publicIP); 
     ipArray.push({'ip': publicIP}); 
     return ipArray; 
    }) 
    .then(MyService.funThree) 
    .then(function() { 
     console.log('res three'); 
    }); 

    promiseArray.push(promise); 
} 
console.log('pA', promiseArray); 
return $q.all(promiseArray); 
+0

Vielen Dank für die wertvolle Eingabe ABER in meiner Situation 'MyService.funThree()' verwendete Daten von 'res2'; also ist es nicht möglich, funThree im nächsten '.then()' –

+0

zu übertreffen. Anstatt "ipArray" hier zurückzugeben, kannst du 'res2' zurückgeben und es als Argument an' MyService.funThree' übergeben. –

Verwandte Themen