Ważne rzeczy do zrozumienia
Obie funkcje theni catchzwracają nowe obiekty obietnicy.
Rzucenie lub jawne odrzucenie przesunie aktualną obietnicę do stanu odrzucenia.
Ponieważ theni catchzwracają nowe obiecane obiekty, można je łączyć.
Jeśli wrzucisz lub odrzucisz wewnątrz programu obsługi obietnic ( thenlub catch), zostanie to rozpatrzone w następnym programie obsługi odrzucenia na ścieżce łączenia.
Jak wspomniano w jfriend00, programy obsługi theni catchnie 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ś Errorprzedmiot. Teraz aktualna obietnica będzie w stanie odrzucenia, a kontrola zostanie przekazana kolejnemu handlerowi, co jest thenw naszym przypadku.
Ponieważ program thenobsługi nie ma modułu obsługi odrzucania, do2nie zostanie on w ogóle wykonany. Możesz to potwierdzić, używając console.logwewną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 catchprzypadku obsługi odrzucania, kiedy to zrobisz console.log(err.stack);, możesz zobaczyć ślad stosu błędów. Teraz wyrzucasz Errorz niego obiekt, więc obietnica zwrócona przez catchbę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 catchprocedury obsługi 1 otrzymujesz wartość promiseobiektu jako odrzuconą.
W ten sam sposób obietnica zwrócona przez catchhandlera 1 jest również odrzucana z tym samym błędem, z jakim promisezostała odrzucona i obserwujemy to w drugim catchhandlerze.
.catch(…)powraca.