Blockiert das Warten die Schleife? Oder wird das i
während des Wartens weiter erhöht?
Nein, warten wird die Schleife nicht blockieren. Ja, wird i
während der Schleife weiter erhöht.
Ist die Reihenfolge von do_something_with_result () in Bezug auf garantiert sequentiell i
? Oder hängt es davon ab, wie schnell die erwartete Funktion für jede ist i
?
Die Reihenfolge do_something_with_result()
wird nacheinander garantiert, jedoch nicht in Bezug aufi
. Dies hängt davon ab, wie schnell die erwartete Funktion ausgeführt wird.
Alle Aufrufe an some_slow_async_function()
werden gestapelt, dh wenn dies a do_something_with_result()
war , wird angezeigt, console
wie oft die Schleife ausgeführt wird. Danach werden nacheinander alle erwarteten Aufrufe ausgeführt.
Zum besseren Verständnis können Sie das folgende Code-Snippet ausführen:
async function someFunction(){
for (let i=0;i<5;i++){
await callAPI();
console.log('After', i, 'th API call');
}
console.log("All API got executed");
}
function callAPI(){
setTimeout(()=>{
console.log("I was called at: "+new Date().getTime())}, 1000);
}
someFunction();
Man kann deutlich sehen, wie die Zeile console.log('After', i, 'th API call');
zuerst für die gesamte Strecke der for-Schleife gedruckt wird und dann am Ende, wenn der gesamte Code ausgeführt wird, Ergebnisse erhalten callAPI()
.
Wenn also Leitungen nach dem Warten vom Ergebnis der Warte-Anrufe abhängen, funktionieren sie nicht wie erwartet.
Zusammenfassend lässt sich sagen, dass await
in for-loop
keine erfolgreiche Operation für das Ergebnis von Warteanrufen gewährleistet ist , deren Abschluss einige Zeit in Anspruch nehmen kann.
Wenn man im Knoten eine neo-async
Bibliothek mit verwendet waterfall
, kann man dies erreichen.