2013-08-16 9 views
15

Ich bin immer noch unklar über den Unterschied zwischen dem Aufrufen eines Resolver Resolve() vs erfüllen()? Ich sehe sowohl die Funktionen als auch die Begriffe "ein Versprechen einlösen" und "Versprechen erfüllen".q.js: Unterschied zwischen resolve() und fulfillment()

Wann sollte ich jedes verwenden?

+0

Ich sehe keine "erfüllen" -Methode in der "q" -Dokumentation. https://github.com/kriskowal/q/wiki/API-Reference – Barmar

+0

siehe auch [Was ist die korrekte Terminologie für Javascript verspricht] (http://Stackoverflow.com/a/29269515/1048572) – Bergi

Antwort

17

Sie sollten resolve verwenden. deferredPromise.resolve(nextPromise) bedeutet, dass alles, was auf deferredPromise wartet, jetzt auf nextPromise wartet. Wenn nextPromise kein Versprechen ist, wird es zu einem erfüllten Versprechen, das fortfährt, alles zu informieren, das darauf wartet, dass der Wert verfügbar geworden ist.

Die fulfill Methode ist eine schlechte Idee, die veraltet sein wird und schließlich ganz weggehen. fulfill ist semantisch äquivalent zu resolve in allen nützlichen Fällen. Es ist nur ein Grund zu existieren ist, dass deferredPromise.fulfill(value) ist einfacher für Menschen zu interpretieren als deferredPromise.resolve(value), da resolve überlastet ist, um sowohl nextPromise und finalValue zu behandeln.

Das Problem mit fulfill existiert überhaupt, dass deferredPromise.fulfill(rejectedPromise) ist semantisch paradox.

+0

... es sei denn, wir würden verschachtelte Versprechen zulassen - semantisch rein :-) – Bergi

+0

@Bergi, es gab viele Diskussionen darüber, aber 'resolve' muss sich nicht ändern. Es wird davon gesprochen, Zwang in "dann" (und andere) zu bewegen und "flatMap" zu verwenden, um streng monadische Versprechen auszupacken. –

15

In der Regel Auflösung bedeutet entweder erfolgreich oder fehlgeschlagen. Das löst den Aufruf der then Aktionen aus. Es kann genau einmal für jedes gegebene Versprechen passieren.

erfüllen bedeutet erfolgreich zu "lösen". Das wird die Rückrufaktionen in den then Aktionen auslösen. Das Gegenstück von "erfüllen" für den Fehler ist zurückweisen.

Aus einer anderen Perspektive, können Sie den Status jedes Versprechen zu einem bestimmten Zeitpunkt als „ungelöst“ oder „gelöst“ und „gelöst“ hat die Zustände Unter (manchmal auch anhängig genannt) kategorisieren von "erfüllt" und "abgelehnt". Ein Versprechen in "erfüllt" Status hat einen Wert, und ein Versprechen in "abgelehnt" Status hat eine Grund.

Die einzelnen Methoden in jeder API, die zur Darstellung dieser Begriffe verwendet werden, unterscheiden sich. Und leider gibt es viele Blogposts und Dokumente, die diese Begriffe verwirren, insbesondere "fullfill", wenn sie "Entschlossenheit" bedeuten oder umgekehrt.

Q

Ich weiß, dass Q nicht sehr gut, aber es scheint, dass seine resolve Methode tatsächlich erfüllt das Versprechen (Hervorhebung hinzugefügt):

Aufruf Entschlossenheit mit einer nicht-Versprechen Wert Ursachen Versprechen zu sein erfüllt mit diesem Wert.

Die Wendung ist jedoch, dass Sie auch deferred.resolve mit dem Versprechen nennen können, in welchem ​​Fall das erste Versprechen mehr oder weniger um den Zustand der übergebenen in Versprechen annimmt. Wenn sich beispielsweise die übergebene Zusage im Status "ausstehend" befindet, übernimmt die Zusage den ausstehenden Status der übergebenen Zusage. Das impliziert die leicht ungerade Semantik, dass eine Methode mit dem Namen resolve das Versprechen nicht löst.

+0

Ich mag Ihre Erklärung . Du hast recht, es ist wirklich verwirrend, dass verschiedene API-Implementierungen unterschiedliche Bedeutung für "Entschlossenheit" und "Erfüllung" haben. – demisx