Ważne rzeczy do zrozumienia
Obie funkcje then
i catch
zwracają nowe obiekty obietnicy.
Rzucenie lub jawne odrzucenie przesunie aktualną obietnicę do stanu odrzucenia.
Ponieważ then
i catch
zwracają nowe obiecane obiekty, można je łączyć.
Jeśli wrzucisz lub odrzucisz wewnątrz programu obsługi obietnic ( then
lub catch
), zostanie to rozpatrzone w następnym programie obsługi odrzucenia na ścieżce łączenia.
Jak wspomniano w jfriend00, programy obsługi then
i catch
nie są wykonywane synchronicznie. Kiedy przewodnik rzuca, natychmiast się kończy. Zatem stos zostanie rozwinięty, a wyjątek zostanie utracony. Dlatego rzucenie wyjątku odrzuca obecną obietnicę.
W twoim przypadku odrzucasz do środka do1
, rzucając jakiś Error
przedmiot. Teraz aktualna obietnica będzie w stanie odrzucenia, a kontrola zostanie przekazana kolejnemu handlerowi, co jest then
w naszym przypadku.
Ponieważ program then
obsługi nie ma modułu obsługi odrzucania, do2
nie zostanie on w ogóle wykonany. Możesz to potwierdzić, używając console.log
wewnątrz. Ponieważ bieżąca obietnica nie ma procedury obsługi odrzucenia, zostanie również odrzucona z wartością odrzucenia z poprzedniej obietnicy, a kontrola zostanie przekazana kolejnej obsłudze, którą jest catch
.
Podobnie jak w catch
przypadku obsługi odrzucania, kiedy to zrobisz console.log(err.stack);
, możesz zobaczyć ślad stosu błędów. Teraz wyrzucasz Error
z niego obiekt, więc obietnica zwrócona przez catch
będzie również w stanie odrzuconym.
Ponieważ nie dołączyłeś żadnej procedury obsługi odrzucania do programu catch
, nie możesz obserwować odrzucenia.
Możesz podzielić łańcuch i lepiej to zrozumieć, w ten sposób
var promise = do1().then(do2);
var promise1 = promise.catch(function (err) {
console.log("Promise", promise);
throw err;
});
promise1.catch(function (err) {
console.log("Promise1", promise1);
});
Wynik, który otrzymasz, będzie podobny do
Promise Promise { <rejected> [Error: do1] }
Promise1 Promise { <rejected> [Error: do1] }
Wewnątrz catch
procedury obsługi 1 otrzymujesz wartość promise
obiektu jako odrzuconą.
W ten sam sposób obietnica zwrócona przez catch
handlera 1 jest również odrzucana z tym samym błędem, z jakim promise
została odrzucona i obserwujemy to w drugim catch
handlerze.
.catch(…)
powraca.