2014-09-25 13 views
8

Jaka jest różnica między używaniem instrukcji .finally() i .done() obietnicy biblioteki Nodejs Q.Jaka jest różnica między bibliotekami Q Promise .finally() i .done()?

Na przykład jaka jest różnica między tymi dwoma?

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

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

Jakie argumenty przechodzisz do '.then',' .finally' i '.done'? – Bergi

+0

Przeczytałem dokumentację i nie znalazłem odpowiedzi, która byłaby tak oczywista. –

+0

obietnica jest teraz częścią specyfikacji JS, części standardu ECMAScript 2015 (ES6). – Pieter

Odpowiedz

17

promise.done(onSuccess, onError) pozwala po prostu na przetworzenie wartości rozwiązanej. Dodatkową korzyścią jest to, że nie oznacza to żadnego połknięcia błędu (jak to jest w przypadku promise.then()), gwarantuje to, że każdy zaangażowany wyjątek zostanie ujawniony. Skutecznie kończy też łańcuch i nie daje żadnych dalszych obietnic.

promise.finally(fn) służy do rejestracji zadania, które musi zostać wykonane po rozpatrzeniu danej obietnicy (nie ma znaczenia, czy przyrzeczenie się powiedzie, czy nie). Zwykle używasz go do pewnego rodzaju operacji czyszczenia, np. wyobraź sobie, że ustawiłeś pasek postępu, który musi być ukryty po wykonaniu żądania (bez względu na to, czy się powiodło), a następnie po prostu wykonaj promise.finally(hideProgressBar). Dodatkowo promise.finally() zwraca obietnicę wejściową, więc możesz zwrócić ją do dalszego przetwarzania.

+0

Dziękujemy za wyjaśnienia! –

+0

Jaka jest różnica między metodą .catch i .fail? – jaumard

+0

'.catch (cb)' jest aliasem dla '.then (null, cb)'. Podczas gdy '.fail' nigdy naprawdę nie zajął się bibliotekami Promise A +. Wydaje mi się, że Q miał go przed wynalezieniem "catch", i zrobił dokładnie to, co "catch" robi teraz. W jQuery 'fail' przyjmuje po prostu fail callback' done' style (bez domniemanego połknięcia błędu). W mojej implementacji rozważam dodanie '.fail (cb)' jako aliasu dla '.done (null, cb)' -> https://github.com/medikoo/deferred/issues/35 –

8

Różnica polega na łańcuchowym i obsługi błędów oraz rejestrowanie błędu:

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

Tutaj, jeśli then rzuca The finally będzie nadal działać, ale błąd nie będzie się zalogować. W Q finally działa niezależnie od tego, czy .then zakończyło się powodzeniem, czy nie. Jest to podobne do słowa kluczowego finally w JS try/catch/finally. W tym przypadku możliwe jest również podłączenie łańcuchów dodatkowych then s.

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

Tutaj done wskazuje, że łańcuch obietnica została zakończona, nie można do niego łańcuch dłużej. Jeśli przekażesz go tylko do obsłużonego programu obsługi, nie będzie on działał, jeśli zostanie odrzucony then i zarejestruje błędy, jeśli zakończy się wyjątkiem.

Powiązane problemy