Frage

Was sind die Unterschiede zwischen Aufschiebungen, Versprechen und Zukunft?
Gibt es eine allgemein zugelassene Theorie hinter all diesen drei?

War es hilfreich?

Lösung

Angesichts der offensichtlichen Abneigung, wie ich versucht habe, die Frage des OP zu beantworten. Die wörtliche Antwort lautet, ein Versprechen ist etwas, das mit anderen Objekten geteilt wird, während ein Aufschiebung privat gehalten werden sollte. In erster Linie kann ein aufgeschobener (der im Allgemeinen das Versprechen erweitert) sich selbst lösen, während ein Versprechen möglicherweise nicht in der Lage ist.

Wenn Sie an den Minutien interessiert sind, dann untersuchen Sie Versprechen/a+.


Meiner Hinweise besteht der übergeordnete Zweck darin, die Klarheit zu verbessern und die Kopplung durch eine standardisierte Schnittstelle zu lockern. Sehen Vorgeschlagene Literatur von @JFriend00:

Anstatt direkt an Funktionen zu übergeben, kann etwas zu eng gekoppelten Schnittstellen führen, und die Verwendung von Versprechen ermöglicht es, Bedenken nach Code zu trennen, die synchron oder asynchron sind.

Persönlich habe ich aufgeschoben, dass ich mit EG-Vorlagen, die von asynchronen Anfragen, Laden von Skripten mit Abhängigkeitsnetzwerken und Nutzer-Feedback zur Bildung von Daten auf nicht blockierende Weise, aufgeschoben wurden.

Vergleichen Sie in der Tat die reine Rückrufform, nach dem Laden von Codemirror im JS -Modus asynchron etwas zu tun (Entschuldigung, ich habe JQuery nicht verwendet in einem während):

/* assume getScript has signature like: function (path, callback, context) 
   and listens to onload && onreadystatechange */
$(function () {
   getScript('path/to/CodeMirror', getJSMode);

   // onreadystate is not reliable for callback args.
   function getJSMode() {
       getScript('path/to/CodeMirror/mode/javascript/javascript.js', 
           ourAwesomeScript);
   };

   function ourAwesomeScript() {
       console.log("CodeMirror is awesome, but I'm too impatient.");
   };
});

Zu den versprechenden formulierten Versionen (wieder entschuldigt ich mich nicht auf dem neuesten Stand auf JQuery):

/* Assume getScript returns a promise object */
$(function () {
   $.when(
       getScript('path/to/CodeMirror'),
       getScript('path/to/CodeMirror/mode/javascript/javascript.js')
   ).then(function () {
       console.log("CodeMirror is awesome, but I'm too impatient.");
   });
});

Entschuldigung für den Semi-Pseudo-Code, aber ich hoffe, er macht die Kernidee etwas klar. Durch die Rückgabe eines standardisierten Versprechens können Sie das Versprechen im Grunde genommen weitergeben und so eine klare Gruppierung ermöglichen.

Andere Tipps

Diese Antworten, einschließlich der ausgewählten Antwort, sind gut für die konzeptionelle Einführung von Versprechen, aber es fehlt an Einzelheiten, was genau die Unterschiede in der Terminologie sind, die bei der Verwendung von Bibliotheken (und dortsind wichtige Unterschiede).

Da ist es immer noch eine sich entwickelnde Spezifikation, Die Antwort kommt derzeit aus dem Versuch, beide Referenzen zu untersuchen (wie wie Wikipedia) und Implementierungen (wie JQuery):

  • Aufgeschoben: Nie in populären Referenzen beschrieben, 1 2 3 4 aber üblicherweise von Implementierungen als Schiedsrichter für die Lösung für Versprechen verwendet (Implementierung resolve und reject). 5 6 7

    Manchmal sind auch Aufschubs verspricht (Implementierung then), 5 6 In anderen Fällen wird es als reiner angesehen, dass die Aufschiebung nur eine Lösung haben und den Benutzer dazu zwingen, auf das Versprechen für die Verwendung zuzugreifen then. 7

  • Versprechen: Das umfassendste Wort für die diskutierende Strategie.

    Ein Proxy -Objekt, das das Ergebnis einer Zielfunktion speichert, deren Synchronizität wir abstrahieren und a then Funktion, die eine andere Zielfunktion akzeptiert und ein neues Versprechen zurückgibt. 2

    Beispiel von Commonjs:

    > asyncComputeTheAnswerToEverything()
        .then(addTwo)
        .then(printResult);
    44
    

     

    Immer in den populären Referenzen beschrieben, obwohl nie angegeben, auf deren Verantwortungsauflösung fällt. 1 2 3 4

    Immer in populären Implementierungen präsent und nie Abiliten für Lösung gegeben. 5 6 7

  • Zukunft: Ein scheinbar veralteter Begriff, der in einigen beliebten Referenzen zu finden ist 1 und mindestens eine beliebte Implementierung, 8 aber scheinbar aus der Diskussion in der Präferenz für den Begriff "Versprechen" ausgewiesen zu werden 3 und nicht immer in beliebten Einführungen zum Thema erwähnt. 9

    Mindestens eine Bibliothek verwendet den Begriff jedoch generisch zum Abstraken von Synchronizität und Fehlerbehebung, ohne bereitzustellen then Funktionalität. 10 Es ist unklar, ob es beabsichtigt war, den Begriff "Versprechen" zu vermeiden, aber wahrscheinlich eine gute Wahl, da Versprechen um "damals" basieren. 2

Verweise

  1. Wikipedia über Versprechen und Futures
  2. Versprechen/A+ Spezifikation
  3. DOM -Standard für Versprechen
  4. DOM Standard verspricht Spec WIP
  5. Dojo -Toolkit -Aufschiebung
  6. JQuery verschoben
  7. Q
  8. FutureJS
  9. Funktionaler JavaScript -Abschnitt über Versprechen
  10. Futures in AngularJS -Integrationstests

Miscially verwirrt Dinge

Was wirklich alles für mich klickte, war für mich diese Präsentation von Domenic Denicola.

In einem Github Gist, Er gab die Beschreibung, die ich am meisten mag, es ist sehr präzise:

Versprechen besteht darin, uns die funktionale Zusammensetzung und Fehler in der asynchronen Welt zurückzugeben.

Mit anderen Worten sind Versprechen ein Weg, der uns schreiben lässt asynchron Code, der fast so einfach zu schreiben ist, als wäre es synchron.

Betrachten Sie dieses Beispiel mit Versprechen:

getTweetsFor("domenic") // promise-returning async function
    .then(function (tweets) {
        var shortUrls = parseTweetsForUrls(tweets);
        var mostRecentShortUrl = shortUrls[0];
        return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
    })
    .then(doHttpRequest) // promise-returning async function
    .then(
        function (responseBody) {
            console.log("Most recent link text:", responseBody);
        },
        function (error) {
            console.error("Error with the twitterverse:", error);
        }
    );

Es funktioniert, als würden Sie diesen synchronen Code schreiben:

try {
    var tweets = getTweetsFor("domenic"); // blocking
    var shortUrls = parseTweetsForUrls(tweets);
    var mostRecentShortUrl = shortUrls[0];
    var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
    console.log("Most recent link text:", responseBody);
} catch (error) {
    console.error("Error with the twitterverse: ", error);
}

(Wenn das immer noch kompliziert klingt, sehen Sie sich diese Präsentation an!)

In Bezug auf den Aufschub ist dies ein Weg dazu .resolve() oder .reject() Versprechen. In dem Versprechen/b Spec, heißt es .defer(). In jQuery ist es $.Deferred().

Bitte beachten Sie, dass die Implementierung von Versprechen in JQuery, soweit ich weiß, zumindest ab JQuery 1.8.2 gebrochen ist (siehe GIST).
Es impliziert angeblich Versprechen/a thenables, Aber Sie erhalten nicht die korrekte Fehlerbehandlung, in dem Sinne, dass das Ganze "Async -Versuch/Catch" -Funktionalität nicht funktioniert. Das ist schade, denn ein "Versuch/Fang" mit asynchronen Code ist absolut cool.

Wenn Sie Versprechen verwenden möchten (Sie sollten sie mit Ihrem eigenen Code ausprobieren!), Verwenden Sie Kris Kowals Q.. Die JQuery -Version ist nur ein Rückruf -Aggregator für das Schreiben von Cleaner JQuery -Code, verfehlt jedoch den Punkt.

In Bezug auf die Zukunft habe ich keine Ahnung, das habe ich in keiner API gesehen.

Bearbeiten: Domenic Denicolas YouTube -Gespräch über Versprechen aus @Bauernhof's Kommentar unten.

Ein Zitat von Michael Jackson (ja, Michael Jackson) aus dem Video:

Ich möchte, dass Sie diesen Satz in Ihrem Kopf verbrennen: Ein Versprechen ist ein Asynchroner Wert.

Dies ist eine hervorragende Beschreibung: Ein Versprechen ist wie eine Variable aus der Zukunft - ein erstklassiger Verweis auf etwas, das irgendwann existieren (oder passieren).

EIN Versprechen stellt einen Proxy für einen Wert dar, der nicht unbedingt bekannt ist, wenn das Versprechen erstellt wird. Sie können Handler mit dem eventuellen Erfolg oder Misserfolg einer asynchronen Aktion in Verbindung bringen. Dadurch können asynchrone Methoden Werte wie synchrone Methoden zurückgeben: Anstelle des Endwerts gibt die asynchrone Methode ein Versprechen zurück, irgendwann in der Zukunft einen Wert zu haben.

https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/promise

Das deferred.promise() Die Methode ermöglicht es einer asynchronen Funktion, zu verhindern, dass ein anderer Code den Fortschritt oder den Status ihrer internen Anforderung beeinträchtigt. Das Versprechen enthält nur die aufgeschobenen Methoden, die erforderlich sind, um zusätzliche Handler anzubringen oder den Zustand zu bestimmen (Dann, erledigt, scheitern, immer, Pfeife, Fortschritt, Zustand und Versprechen), aber nicht diejenigen, die den Zustand verändern (Lösen, ablehnen, benachrichtigen, mit Ablehnen und notifywith melden).

Wenn das Ziel bereitgestellt wird, deferred.promise() Bindet die Methoden daran und gibt dann dieses Objekt zurück, anstatt eine neue zu erstellen. Dies kann nützlich sein, um das Versprechenverhalten einem bereits existierenden Objekt beizubringen.

Wenn Sie eine Aufschiebung erstellen, erhalten Sie einen Hinweis auf die Aufschiebung, damit sie irgendwann gelöst oder abgelehnt werden kann. Geben Sie nur das Versprechensobjekt über aufgeschobene.

Einfach können wir das sagen a Versprechen repräsentiert einen Wert, der noch nicht bekannt ist, wo als Aufgeschoben Repräsentiert Arbeit, die noch nicht fertig ist.


enter image description here

  • EIN promise stellt einen Wert dar, der noch nicht bekannt ist
  • EIN deferred repräsentiert Arbeit, die noch nicht fertig ist

Ein Versprechen ist ein Platzhalter für ein Ergebnis, das ursprünglich unbekannt ist, während ein Aufschub die Berechnung darstellt, die zum Wert führt.

Bezug

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top