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ę loggernie powiedzie, błąd zostanie przekazany do następującego .catch()wywołania zwrotnego, ale nie do failwywoł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 breakoświadczenie czujesz się trochę dziwne, to jest rzeczywiście to, co python ma try-except-elsedla (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 catchrejestrują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.