2014-09-25 11 views
8

Was ist der Unterschied zwischen der Verwendung der Anweisungen final() und .done() der Nodejs Q promise-Bibliothek?Was ist der Unterschied zwischen den Q. Promise-Bibliotheken .finally() und .done()?

Zum Beispiel, was ist der Unterschied zwischen diesen beiden?

Q(...) 
.then(...) 
.finally(); //or fin() 

Q(..) 
.then() 
.done(); 
+0

Welche Argumente übergeben Sie an '.then',' .finally' und '.done'? – Bergi

+0

Ich habe die Dokumente gelesen und fand die Antwort selbst nicht so offensichtlich. –

+0

Versprechen ist jetzt Teil der JS-Spezifikation, Teil des ECMAScript 2015 (ES6) -Standards. – Pieter

Antwort

17

promise.done(onSuccess, onError) ermöglicht Ihnen einfach, den aufgelösten Wert zu verarbeiten. Ein zusätzlicher Vorteil ist, dass kein Fehler beim Schlucken impliziert wird (wie es bei promise.then() der Fall ist), es garantiert, dass jede involvierte Ausnahme offengelegt wird. Es beendet auch effektiv die Kette und gibt kein weiteres Versprechen zurück.

promise.finally(fn) ist für das Registrieren einer Aufgabe, die ausgeführt werden muss, nachdem eine gegebene Zusage aufgelöst wurde (es spielt keine Rolle, ob die Zusage erfolgreich ist oder fehlschlägt). Normalerweise verwenden Sie es für eine Art von Bereinigungsoperationen, z. Stellen Sie sich vor, Sie richten einen Fortschrittsbalken ein, der nach Abschluss der Anfrage ausgeblendet werden muss (egal ob erfolgreich), dann tun Sie einfach promise.finally(hideProgressBar). Darüber hinaus gibt promise.finally() Eingabeversprechen zurück, sodass Sie es zur weiteren Verarbeitung zurückgeben können.

+0

Danke für die Klarstellung! –

+0

Und was ist der Unterschied zwischen .Catch und .Fail-Methode? – jaumard

+0

'.catch (cb)' ist ein Alias ​​für '.then (null, cb)'. Während ".fail" nie wirklich in Promise A + Bibliotheken angesiedelt ist. Ich denke, Q hatte es, bevor "catch" geprägt wurde, und es machte genau das, was "catch" jetzt macht. In jQuery 'fail' wird nur der' fone' Callbacks-Style ausgeführt (ohne Fehler beim Schlucken). In meiner Implementierung erwäge ich '.fail (cb)' als Alias ​​für '.done (null, cb)' -> https://github.com/medikoo/deferred/issues/35 hinzuzufügen –

8

Der Unterschied ist in Verkettungs und Fehlerbehandlung und Fehlerprotokollierung:

Q(...) 
.then(...) 
.finally(); 

Wenn hier die then wirft, die finally noch laufen, aber kein Fehler protokolliert. In Q finally wird unabhängig davon ausgeführt, ob .then erfolgreich ist oder nicht. Dies ist wie das Schlüsselwort finally in JS try/catch/finally. Es ist auch möglich, in diesem Fall zusätzliche then s an die Kette zu ketten.

Q(..) 
.then() 
.done(); 

Hier done zeigt an, dass das Versprechen Kette beendet ist, können Sie nicht Kette, um es nicht mehr. Wenn Sie es nur einen onFulilled-Handler übergeben, wird es nicht ausgeführt, wenn then warf, und es protokolliert Fehler, wenn es mit einer Ausnahme endet.