2015-09-27 11 views
5

Mam zamieszanie związane z łańcuchem obietnicy w ES6.O łańcuchu obietnicy w ES6

function taskA() { 
 
    console.log("Task A"); 
 
    throw new Error("throw Error @ Task A") 
 
} 
 

 
function taskB() { 
 
    console.log("Task B"); 
 
} 
 

 
function onRejected(error) { 
 
 console.log(error);// => "throw Error @ Task A" 
 
} 
 
    
 
function finalTask() { 
 
    console.log("Final Task"); 
 
} 
 

 
var promise = Promise.resolve(); 
 
promise 
 
.then(taskA) 
 
.then(taskB) 
 
.catch(onRejected) 
 
.then(finalTask);

Co gubię oto dlaczego finalTask zostanie wywołana? Czy łańcuch catch() zwraca rozstrzygniętą obietnicę?

+0

możliwy duplikat [Przywołane obietnice nieprzekazujące odrzucenia] (http://stackoverflow.com/q/16371129/1048572) – Bergi

Odpowiedz

13

Po podaniu obsługi .catch() lub drugiego argumentu dla .then() odrzucona obietnica została "obsłużona". Domyślnie, gdy podasz taki program obsługi odrzucania, system obietnic zakłada, że ​​odrzucenie zostało obsłużone, a łańcuch powinien być kontynuowany.

Jeśli nie chcesz, aby łańcuch był kontynuowany, możesz odrzucić odrzuconą obietnicę lub podać błąd. To spowoduje zatrzymanie tego łańcucha, aż do momentu, gdy inny operator odrzuci łańcuch.

Tak, tu są możliwości w łańcuchu jak pokażesz:

1) Nie ma odrzucić obsługi w łańcuchu

Łańcuch zostaje zatrzymany w całości i bez dalszego .then() spełniać teleskopowe są wykonywane .

2) W łańcuchu znajduje się operator odrzuceń, który albo niczego nie zwraca, albo zwraca normalną wartość, spełnioną obietnicę lub obietnicę, która ostatecznie się spełni.

To właśnie pokazuje Twój kod. Odrzucenie jest traktowane jako obsługiwane, a obiecujący stan łańcucha zmienia się w spełnioną obietnicę, tak aby wywoływać kolejne procedury obsługi w łańcuchu.

3) Jest odrzucić obsługi w łańcuchu, który albo zwraca odrzucony obietnicę lub zgłasza błąd

zwrotu odrzucony obietnicy (lub obietnicę, że odrzuca w przyszłości) lub rzucanie nowy błąd (która zostaje przekształcona w odrzuconą obietnicę) przerwie dalsze przetwarzanie łańcucha aż do następnego programu obsługi błędów.

Tak więc, jeśli zmieniłeś obsługi do tego onRejected():

function onRejected(error) { 
  console.log(error); 
    throw error; // rethrow error to stop the rest of the chain 
} 

Następnie Twój łańcuch obietnica będzie tam zatrzymać.


Ważne jest, aby zrozumieć, dlaczego działa w ten sposób. Pozwala to na obsługę błędu w środku łańcucha obietnic, a kod obsługujący błąd decyduje, czy łańcuch jest kontynuowany, czy nie, w oparciu o to, co zwraca lub rzuca. Jeśli nie zwraca nic lub wartość normalną lub spełnioną obietnicę, przetwarzanie łańcucha trwa - błąd został obsłużony - nie ma potrzeby zatrzymywania dalszego przetwarzania.

Ale jeśli błąd jest bardziej poważny, a przetwarzanie nie powinno być kontynuowane, wówczas program obsługi odrzuceń może albo rzucić ten sam błąd, albo wygenerować inny błąd, albo zwrócić odrzuconą obietnicę, a łańcuch pominie wszelkie procedury obsługi do momentu następny menedżer odrzucający w łańcuchu.

+1

Wielkie dzięki! Twoje wyjaśnienie jest całkiem jasne. – JasmineOT

+2

To jest całkiem analogiczne do 'catch' w synchronicznym' try {} catch (e) {} 'w ten sposób (błąd jest obsługiwany, chyba że zostanie ponownie wysłany). – jib