Nolans Versprechen / A + JavaScript-Puzzles

8

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:

  1. Warum hat doSomethingElse() im ersten Puzzle undefined value? Meiner Meinung nach muss resultOfDoSomething wie im 4. Puzzle sein.

  2. 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?

  3. Warum doSomethingElse() Funktion in dem 3. Puzzle Start im selben Moment als doSomething ?

    
Turak Vladyslav 27.10.2015, 20:13
quelle

6 Antworten

3
  
  1. Warum funktioniert doSomethingElse() im ersten Rätsel [wird weitergegeben] undefined ?
  2.   

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]

  
  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 .
  2.   

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).

  
  1. Warum beginnt doSomethingElse() im 3. Puzzle im selben Moment wie doSomething ?
  2.   

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:

  1. Führe doSomething aus, was ein Versprechen
  2. zurückgibt
  3. Hängen Sie 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.
  4. Fügen Sie die Funktion finalHandler dem Versprechen
  5. hinzu
Whymarrh 27.10.2015, 20:45
quelle
1
%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.

    
poke 27.10.2015 20:44
quelle
1

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 ...

    
Fasoeu 27.10.2015 21:17
quelle
1
  

Warum hat doSomethingElse() im ersten Puzzle undefined value? Meiner Meinung nach muss resultOfDoSomething 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:

%Vor%
  

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 macht doSomethingElse 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:

%Vor% %Vor%

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 wie doSomething ?

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

%Vor%

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: -)

    
Bergi 28.10.2015 09:07
quelle
1

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.

%Vor%
    
Tshunglee 24.02.2017 07:48
quelle
0

Lange Rede kurzer Sinn - einfache 2 Regeln, um Ihre Beispiele verständlich zu machen:

  1. Das Zurückgeben eines Werts aus .then entspricht dem Zurückgeben eines Versprechens, das mit diesem Wert aufgelöst wird.

  2. 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.

    
vitaly-t 28.10.2015 06:46
quelle

Tags und Links