Какая разница?
.then()
Вызов возвратит обещание , что будет отвергнута в случае обратного вызова выдает ошибку. Это означает, что если ваш успех logger
не удался , ошибка будет передана в следующий .catch()
обратный вызов, но не в fail
обратный вызов, который идет вместе с success
.
Вот схема потока управления :
Чтобы выразить это в синхронном коде:
// 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);
}
Второй log
(который аналогичен первому аргументу .then()
) будет выполняться только в том случае, если исключение не произошло. Помеченный блок иbreak
оператор чувствуют себя немного странно, это именно то , try-except-else
для чего предназначен python (рекомендуется к прочтению!).
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
catch
Регистратор будет также обрабатывать исключения из вызова успеха регистратора.
Так много для разницы.
Я не совсем понимаю его объяснение относительно попытки поймать
Аргумент заключается в том, что обычно вы хотите отлавливать ошибки на каждом этапе обработки и не должны использовать его в цепочках. Предполагается, что у вас есть только один конечный обработчик, который обрабатывает все ошибки, в то время как при использовании «antipattern» ошибки в некоторых из обратных вызовов не обрабатываются.
Тем не менее, этот шаблон на самом деле очень полезен: когда вы хотите обработать ошибки, которые произошли именно на этом шаге, и вы хотите сделать что-то совершенно иное, когда ошибки не произошло - то есть, когда ошибка не устраняется. Помните, что это ветвит ваш поток управления. Конечно, это иногда желательно.
Что не так с этим следующим?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Что вам пришлось повторить ваш обратный звонок. Ты скорее хочешь
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});
Вы также можете рассмотреть возможность использования .finally()
для этого.
then().catch()
является более читабельным, так как вам не нужно искать запятую и исследовать, является ли это обратным вызовом для ветки успеха или неудачи.