Ich habe Wir haben ein Problem mit dem Versprechen von Nolan Lawson für ein paar Mal, aber immer noch einige Fragen über Versprechen in JavaScript. Am Ende von Nolans Beitrag findest du Antworten auf vier Rätsel (ich habe hier Screenshots angehängt).
Also, ich habe ein paar Fragen:
Warum hat doSomethingElse()
im ersten Puzzle undefined
value? Meiner Meinung nach muss resultOfDoSomething
wie im 4. Puzzle sein.
Was ist der Unterschied zwischen dem 3. und 4. Rätsel? Im 3. Puzzle in dem ersten then
schreiben wir doSomethingElse()
und im 4. Puzzle schreiben wir hier nur den Namen Funktion doSomethingElse
. Wie ist es möglich? Was macht wirklich doSomethingElse
innerhalb der then
des vierten Puzzles?
Warum doSomethingElse()
Funktion in dem 3. Puzzle Start im selben Moment als doSomething
?
- Warum funktioniert
doSomethingElse()
im ersten Rätsel [wird weitergegeben]undefined
?
Sehen wir uns ein einfacheres Beispiel an:
%Vor% Der Unterschied zwischen den beiden Linien ist was? In Zeile 1 rufen wir foo auf, geben aber keinen Wert weiter (daher undefined
), während wir in Zeile 2 foo aufrufen und 42 übergeben.
Zurück zum Beitrag:
%Vor% Wie ist das anders als beim vierten Puzzle? Im vierten Puzzle übergeben wir einen Verweis auf die Funktion an then
. Wenn man dem Versprechen den Verweis auf die Funktion gibt, kann man es zu einem späteren Zeitpunkt mit dem Ergebnis des Versprechens aufrufen. [1]
- Was ist der Unterschied zwischen dem dritten und vierten Rätsel? Im dritten Puzzle [...] schreiben wir
doSomethingElse()
und im vierten Puzzle schreiben wir [...]doSomethingElse
.
Um die Unterschiede im dritten und vierten Rätsel zu erklären, schauen wir uns einfachere Beispiele an. Wie unterscheiden sich die folgenden zwei Zeilen:
%Vor% Im obigen Ausschnitt enthält a
einen Verweis auf die Funktion foo
, während b
das Ergebnis des Aufrufs von foo enthält (was 42 wäre).
- Warum beginnt
doSomethingElse()
im 3. Puzzle im selben Moment wiedoSomething
?
Vergleichbar mit den Unterschieden zwischen der 3. und 4. Funktion, beachten Sie die Verwendung von ()
für Aufruf (oder Aufruf) der Funktion. Hier rufen wir sowohl doSomething()
als auch doSomethingElse()
an, anstatt darauf zu warten, dass das Versprechen "aufgelöst" wird (warten, bis der erste Anruf beendet ist). vor Lassen Sie uns durch die Ausführung gehen:
doSomething
aus, was ein Versprechen doSomethingElse()
an das Versprechen an, aber warten Sie, bis doSomethingElse()
uns doSomethingElse()
aufruft, so dass async passiert und wir das Versprechen beifügen, das es an das Versprechen zurückgibt doSomething()
returned. finalHandler
dem Versprechen %Vor%Warum hat die Funktion doSomethingElse () im 1st-Puzzle einen undefinierten Wert? Meiner Meinung nach muss es Ergebnis wie im 4-ten Puzzle haben.
Das versprochene Ergebnis von doSomething
wird an die anonyme Funktion übergeben (die kein Argument akzeptiert). Was dort passiert ist verloren. Und doSomethingElse
wird ohne Argumente aufgerufen, daher ist das erste Funktionsargument undefined
.
%Vor%Was ist der Unterschied zwischen den 3-ten und 4-ten Puzzles? Im 3-rd. Puzzle schreiben wir dann doSomethingElse () und im 4-ten Puzzle schreiben wir hier nur den Namen der Funktion - doSomethingElse. Wie ist es möglich? Was macht wirklich etwasElsel im 4. Puzzle?
Funktionen in JavaScript sind Objekte, die Sie beliebig weitergeben können. So funktioniert die Callback-Funktion: Es gibt eine Funktion (hier ist then
), die eine Funktion als Parameter übernimmt, die später aufgerufen wird.
Im letzteren Code ist die Funktion, die an then
übergeben wird, doSomethingElse
, also die Funktion, die später aufgerufen wird. Aber im ersten Fall nennen wir doSomethingElse
direkt (mit den Klammern ()
). Was also an then
übergeben wird, ist der Rückgabewert dieser Funktion - was unwahrscheinlich ist, dass eine Funktion ausgewertet werden kann, sobald das Versprechen abgeschlossen ist.
Warum startet doSomethingElse () im 3-ten Puzzle im selben Moment wie etwas?
Wie gesagt, die Funktion wird sofort aufgerufen, gleichzeitig rufen Sie doSomething
auf. Nur der Rückgabewert wird an then
übergeben, der dann aufgerufen wird, sobald das Versprechen aufgelöst wird.
Sie müssen darauf achten: doSomethingElse
ist eine Funktionsreferenz, während doSomethingElse()
bedeutet, dass Sie die Funktion sofort "aufrufen". Hier können Sie das Ergebnis der Funktion erhalten, falls vorhanden ...
Über Versprechen habe ich verstanden:
A) Die "then" -Methode nimmt das Ergebnis des vorherigen Aufrufs und übergibt es als Parameter an seinen eigenen Parameter, wenn es sich um eine Funktion handelt.
B) Die Ausführung wird nur verzögert, wenn die Funktion innerhalb der "then" -Methode etwas zurückgibt.
In diesen Situationen haben wir:
Puzzle 1) resultOfDoSomething wird als Parameter für die anonyme Funktion verwendet
%Vor% Dies ruft doSomethingElse()
ohne Parameter auf.
Puzzle 2) Die anonyme Funktion gibt keine Daten zurück, so dass das nächste "then" sofort ausgeführt wird
Puzzle 3) Der Ausdruck doSomethingElse()
ist das Ergebnis des Aufrufs von doSomethingElse. Dieser Wert wird als Parameter für den „dann“ -Methode verwendet, und da es keine Funktion ist (in diesem Beispiel!), Können wir auf den anderen „dann“ übergeben ...
finalHandler erhält die letzten gültigen Ergebnisse als Parameter, in diesem Fall resultOfDoSomething.
Puzzle 4) Jede "then" -Methode empfängt als Parameter die Referenz einer Funktion. Jede dieser Funktionen wird mit den vorherigen Ergebnissen als Parameter aufgerufen. Also, jede Funktion muss auf das Ergebnis der vorherigen Ausführung warten ... und hier haben Sie die Warteschlange der Versprechen ...
Warum hat
doSomethingElse()
im ersten Puzzleundefined
value? Meiner Meinung nach mussresultOfDoSomething
wie im 4. Puzzle sein.
Nein. Der resultOfDoSomething
wird an den Callback übergeben, mit dem then
aufgerufen wurde, ja, aber wir ignorieren ihn einfach im ersten Code:
Was ist der Unterschied zwischen dem 3. und 4. Rätsel? Im dritten Puzzle in der ersten schreiben wir dann
doSomethingElse()
und im vierten Puzzle schreiben wir hier nur den Namen der Funktion,doSomethingElse
. Wie ist es möglich? Was machtdoSomethingElse
wirklich im 4. Puzzle?
Wie Sie wahrscheinlich wissen, ist dies der Unterschied zwischen einer aufgerufenen Funktion und der Funktion selbst.
Außerdem wollen wir immer - nein: müssen - eine Callback-Funktion an then(…)
übergeben. Die folgenden zwei sind gleichwertig:
Das wird erwartet - Sie übergeben dem Aufruf eine Funktion, so dass er wie üblich an das Versprechen angekettet ist. Aber callback()
(mit dem Aufruf) ist keine Funktion mehr:
Warum startet
doSomethingElse()
im 3. Puzzle im selben Moment wiedoSomething
?
Weil es sofort im Ausdruck then(doSomethingElse())
aufgerufen wird - es wird tatsächlich vor then
aufgerufen, zu dem es ein Argument ist. Es wird also tatsächlich ein Moment nach doSomething()
genannt, aber bei der gleichen Ereignisschleife; und die zwei asynchronen etwas werden parallel laufen.
then
akzeptiert nur Funktionsargumente, alles andere wird ignoriert . Es gibt also hier keine Verkettung, es ist dasselbe wie bei
Nicht was wir wollen!
Übrigens werden diese auch erklärt als " Fortgeschrittener Fehler # 3: Versprechen gegen Fabrikversprechen " und " Fortgeschrittener Fehler # 5: Versprechen fallen durch ", was ich beide würde als Anfänger Fehler betrachten: -)
Ich denke, die Ausführungsreihenfolge von ist immer zuerst DoSomethingElse dann DoSomethingElse und FinalHandler. Dies ist nur JavaScript-Syntax.
Der Unterschied besteht darin, dass die Argumente, die zur Funktion übergeben werden, unterschiedlich sind.
Die beiden Funktionen geben zwei Versprechen zurück. Die Ausführungsreihenfolge der beiden Versprechen wird in Zahlen angezeigt, die Sie gepostet haben. Ich denke der Autor meint die Reihenfolge von zwei Versprechen nicht die Ausführungsreihenfolge der Funktion.
Lange Rede kurzer Sinn - einfache 2 Regeln, um Ihre Beispiele verständlich zu machen:
Das Zurückgeben eines Werts aus .then
entspricht dem Zurückgeben eines Versprechens, das mit diesem Wert aufgelöst wird.
Wenn Sie nichts zurückgeben, entspricht dies der Rückgabe von undefined
, was wiederum die Regel # 1 bewirkt.
Wenn Sie diese 2 im Hinterkopf behalten, werden Ihre Versprechen Rätsel als Tag klar.
Tags und Links javascript promise es6-promise