2017-06-28 7 views
3

Vor der Aktualisierung von Chrome auf 58 hatte ich keine Fehler.Versprochen Unerwartetes Verhalten, Ausführungsreihenfolge

Weitere Erläuterung: Mein Code am Sonntag arbeitet, ich, fand später über diese 2 Tage keine Kenntnis von der async Art der Hinrichtung war aus!

new Promise((s, f) => { 
    console.log(1); 
    s(); 
    console.log(2); 
}) 
.then(r => {console.log(3)}) 

console.log(4); 

OUTPUT:


1- Warum wird 'then' nach console.log (2) ausgeführt?

Mögliche Antwort: weil das Versprechen Ergebnis, nachdem der Körper ausgeführt wird kehrt

2- Warum 'und dann' nach console.log ausgeführt werden soll (4) ???

+3

Versprechen sollen nicht synchron sein. Stellen Sie sich vor, der Resolver/Rejector würde stattdessen 'setTimeout (function() {...})' 'und Sie würden im Grunde das gleiche Verhalten erhalten. –

+0

Ich habe diese Reihenfolge für alle meine Testbrowser (Firefox/Chrome/Edge/Opera). Für die erste Frage weiß ich nicht, aber es scheint Logik, dass 3 nach 4 kommt, wie in einem regulären Async-Aufruf, der Code folgt vor dem Rückruf ausgeführt wird. – Kaddath

+0

@PatrickRoberts richtig, aber mein Code arbeitete am Sonntag, ich war mir der Async-Natur in der Ausführung nicht bewusst, habe heute darüber herausgefunden, interessant! –

Antwort

1

Aufgrund der asynchronen Art von Versprechen wird der Handler then in der Nachrichtenwarteschlange der Ereignisschleife gespeichert. Elemente dieser Warteschlange werden verarbeitet, wenn der Call-Stack der JavaScript-Laufzeit leer ist. In Ihrem Szenario muss console.log(4); ausgeführt werden, bevor die umschließende Funktion aus dem Aufrufstapel entfernt werden kann. An diesem Punkt kann die JavaScript-Engine mit der Verarbeitung von Elementen aus der Nachrichtenwarteschlange beginnen (vorausgesetzt, die umschließende Funktion ist die Funktion auf oberster Ebene) Ausführen des Codes innerhalb then.