Co za różnica?
.then()
Rozmowa powróci obietnicę, że zostanie odrzucona w przypadku oddzwaniania zgłasza błąd. Oznacza to, że gdy Twój sukces się logger
nie powiedzie, błąd zostanie przekazany do następującego .catch()
wywołania zwrotnego, ale nie do fail
wywołania zwrotnego, które towarzyszy success
.
Oto schemat kontrolny :
Aby wyrazić to w kodzie synchronicznym:
// some_promise_call().then(logger.log, logger.log)
then: {
try {
var results = some_call();
} catch(e) {
logger.log(e);
break then;
} // else
logger.log(results);
}
Drugi log
(który jest jak pierwszy argument .then()
) zostanie wykonany tylko w przypadku, gdy nie wystąpi żaden wyjątek. Znakowany blok i break
oświadczenie czujesz się trochę dziwne, to jest rzeczywiście to, co python ma try-except-else
dla (zalecane lektury!).
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
Program catch
rejestrujący będzie także obsługiwał wyjątki od wywołania programu rejestrującego sukces.
Tyle o różnicy.
Nie do końca rozumiem jego wyjaśnienie dotyczące próby złapania
Argument jest taki, że zwykle chcesz wychwytywać błędy na każdym etapie przetwarzania i że nie powinieneś używać go w łańcuchach. Oczekuje się, że masz tylko jeden końcowy moduł obsługi, który obsługuje wszystkie błędy - podczas gdy podczas korzystania z „antipattern” błędy w niektórych wywołaniach zwrotnych nie są obsługiwane.
Jednak ten wzorzec jest w rzeczywistości bardzo przydatny: gdy chcesz obsłużyć błędy, które wystąpiły dokładnie w tym kroku, i chcesz zrobić coś zupełnie innego, gdy nie wystąpił błąd - tj. Gdy błąd jest nie do naprawienia. Pamiętaj, że to rozgałęzia twój przepływ kontroli. Oczywiście jest to czasem pożądane.
Co jest z tym nie tak?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Że musisz powtórzyć oddzwonienie. Raczej chcesz
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});
Możesz również rozważyć użycie .finally()
do tego celu.
then().catch()
jest bardziej czytelny, ponieważ nie musisz szukać przecinka i sprawdzać, czy jest to wywołanie zwrotne dla gałęzi sukcesu lub niepowodzenia.