2017-10-13 2 views
-1

Wenn ich das Versprechen lösen, sollte die Funktion wird ausgeführt fortsetzen:Versprechen lösen Verwirrung

function test(){ 
    return new Promise(resolve=>{ 
     resolve(5) 
     setTimeout(()=>{console.log(7)}, 2000} 
    }) 
} 

Und dann rufe ich die Funktion wie diese

test().then(console.log); 

So druckt 5, und dann nach 2 Sekunden, es druckt 7, wie ich erwartet habe. Aber wenn ich arbeite mit Syncthing nach resolve() funktioniert es anders:

function test(){ 
    return new Promise(resolve=>{ 
     resolve(5) 
     for(let i = 0; i < 100; i++) 
      console.log(i) 
    }) 
} 

Jetzt druckt er die Zahlen von 0 bis 100, und dann druckt es 5. Aber ich erwartet, dass es 5 durch Entschlossenheit zurückzukehren() und nur dann drucken Sie alle anderen Sachen.

+0

Nein. Sie sollten 'resolve resolve (5)' tun und danach nichts tun. Ansonsten, warum lösen Sie .... – yBrodsky

+0

@ybrodsky nicht wahr. Sie können die Auflösung verwenden, ohne sie explizit zurückzugeben. Die einzige wichtige Sache, die zurückkommt, ist das "neue Versprechen". – Andrew

+0

Das Schlüsselwort ist sollte. Irgendein praktisches Beispiel, in dem Sie nach der Entschlossenheit weitermachen wollen, innerhalb des Versprechens ?. – yBrodsky

Antwort

-2

Also, ein paar Dinge wollte ich sicherstellen, dass wir auf der gleichen Seite sind. Ihre test Funktion setTimeout ist asynchron. Ja, es liegt in einem Versprechen, aber Sie haben es unkontrolliert an die Ereignisschleife gesendet.

setTimeout(()=>{console.log(7)}, 2000} //not controlled in your first function

Was auch immer Sie in resolve Ort ist die einzige Sache, die durch das Versprechen gesteuert wird. Die Art, wie Sie das Versprechen verwenden, ist nicht, wie sie verwendet werden sollen. Sie müssen vielleicht zu den Grundlagen zurückkehren und sich etwas mehr darüber aneignen, wenn das Sie verwirrt.

edit: Ich schien mich nicht richtig artikuliert zu haben und habe somit ziemlich viel Salz gesammelt. Bessere Erklärung:

Sie sollten eine promise behandeln, wie Sie eine Rückkehr Aussage würden. Eine Promise-Funktion sollte außer einer einzelnen resolve-Anweisung keine andere Ausgabeoperation ausführen. Dies kann dann in nachfolgenden Funktionen in eine andere Funktion synchron gesteuert werden. Schlüsselwort ist ein anderes.

function test(){ 
    return new Promise(resolve=>{ 
     resolve(5) 
    }) 
} 

function loopTest() { 
    test().then((num) => { 
    console.log(num) 
    for (let i = 0; i < 10; i++) { 
     console.log(i) 
    } 
    }) 
} // what you were trying to actually accomplish 

loopTest() 
+0

Danke. Aber tut mir leid, ich verstehe nicht ganz, was Sie unter "unkontrolliert" sagen wollen –

+0

@FureturPhyarell aktualisiert – Andrew

-1

Ich denke, es event loop mit JavaScripts zu tun hat. Mit dem Link können Sie erstaunliche Video über Event-Loop in JS sehen. Ich bin mir nicht sicher, aber es scheint wie das, was ist innerhalb resolve() wird asynchron aufgerufen, aber for loop ist sync, das ist, warum was in resolve ist in eine Warteschlange gelegt und For-Schleife wird sofort ausgeführt. Nachdem der "normale" Ausführungsprozess abgeschlossen ist, wird der Job aufgelöst und 0 zurückgegeben.

In dem Beispiel mit setTimeout haben Sie den Code in die Warteschlange gestellt, aber für die spätere Ausführung (2000ms). Da 5 nichts tut, wird es sofort (asynchron) zurückgegeben und nach 2 Sekunden wird der Code ausgeführt. Wath das Video.

1

Der Code gibt das erwartete Ergebnis. Wenn Sie sofort mit 5 auflösen, wird die Ausführung der Funktion noch nicht abgeschlossen, sodass der Rest des Codes ausgeführt wird. Sobald dies erledigt ist, ist der Aufruf-Stack leer und der asynchrone then hat seine Chance zu laufen. Der Unterschied zwischen den beiden Programmen besteht darin, dass der zweite sofort protokolliert wird, da er nicht auf die Ausführung der Funktion warten muss. Es ist synchron.

-1

Ich fand es heraus. Nodejs führt Code von links nach rechts aus. Zuerst gibt es mir eine Funktion mit resolve als Argumente zurückweisen, dann führt es diese Funktion aus. Es löst den Wert auf. Dann trifft es auf eine synchrone for-Schleife, daher muss es synchron ausgeführt werden. Dann gibt es ein bereits aufgelöstes Versprechen zurück, dass ich die Methode dann anwende.then() führt den Callback aus, wenn das Versprechen gelöst ist. Es ist bereits gelöst. Und es druckt mein aufgelöst Wert Wenn Sie Rückrufe verwenden wird es anders sein:

function test(callback){ 
    callback(7) 
    for(let i = 0; i<100; i++){ 
     console.log(i) 
    } 
} 

wird es zuerst, print (7) und erst dann alle übrigen Zahlen Aber es funktioniert nur, wenn Sie wissen, dass der Rückruf wird einmal aufgerufen werden. Denn sonst wird es die Logik brechen.

+1

Offensichtlich, weil Callbacks synchron sind und Versprechen sind asynchron implementiert .. Aber das beantwortet nicht Ihre Frage - warum es zuerst und dann löst das Versprechen auf. – aprok

+0

Es tut etwas, weil ich jetzt weiß, dass der Unterschied wegen der Implementierung des Versprechens besteht –

+0

Wahrscheinlich jetzt muss ich nur googlen, wie Versprechungen gemacht werden –

Verwandte Themen