2016-10-06 2 views
5

Ich brauche eine "endlose" While-Schleife, die Versprechen hat. Hier einige Beispiel-Code:Wie eine asynchrone Endlosschleife mit Promises

let noErrorsOccured = true 

while (noErrorsOccured){ 
    someAsyncFunction().then(() => { 
     doSomething(); 
    }).catch((error) => { 
     console.log("Error: " + error); 
     noErrorsOccured = false; 
    }); 
} 

function someAsyncFunction() { 
    return new Promise ((resolve, reject) => { 
     setTimeout(() => { 
      const exampleBool = doSomeCheckup(); 
      if (exampleBool){ 
       resolve(); 
      } else { 
       reject("Checkup failed"); 
      } 
     }, 3000); 
    }); 
} 

Also diese while-Schleife sollte endlos laufen, es sei denn ein Fehler auftritt, dann wird die while-Schleife stoppen sollte. Wie kann ich das erreichen?

Ich hoffe, Sie verstehen, was ich meine, und Dank im Voraus :)

+1

Versprechen Reaktionen (Aufruf erfüllt oder Ablehnung Handler) werden asynchron nach einem Thread ausgeführt wodurch sie ausgeführt werden, abgeschlossen. Die erste while-Schleife ist eine unendliche ** blocking ** -Schleife, die eine unendliche Anzahl von Versprechen erzeugt, die nie erledigt werden, weil Timeout-Callbacks nie auftreten: D _Possibly_ Sie möchten einen Timeout- oder Intervall-Timer, der 3 Sekunden nach einem vorherigen Versprechen wartet erstellt für eine asynchrone Prüfung wird vor dem Ausführen einer anderen Prüfung abgerechnet? – traktor53

+0

Das Problem ist, dass ich nicht wirklich weiß, wie lange es dauert, bis mein Versprechen gelöst ist. Ich habe nur 'setTimeout()' verwendet, um mein Beispiel zu verdeutlichen. Aber die Lösung von Felix Kling funktioniert perfekt, es gibt keine Notwendigkeit für eine andere Lösung, aber trotzdem danke :) – C4rmond4i

Antwort

4

Wie kann ich das erreichen?

Nicht mit einer Sperrschleife, da Versprechungen nicht in der Lage sein werden, sich zu beruhigen. Sie können mehr über JavaScript's event loop on MDN erfahren.

Stattdessen die Funktion erneut aufrufen, wenn das Versprechen behoben:

Promise.resolve().then(function resolver() { 
    return someAsyncFunction() 
    .then(doSomething) 
    .then(resolver); 
}).catch((error) => { 
    console.log("Error: " + error); 
}); 
+0

Das funktioniert auch: P –

+0

Ah hatte ich zuerst versaut. Guckte nicht auf den OPs Original Code in der Nähe – Bergi

+0

Dieser Code wird "essen" den Fehler, der auftritt, wahrscheinlich in Ordnung in diesem Fall, aber BE WEARY eines '.catch ((err) => {})' das nicht tut enthält einen 'throw err;'. – kingdango