Qual é a diferença?
A .then()
chamada retornará uma promessa que será rejeitada caso o retorno de chamada gere um erro. Isso significa que, quando seu sucesso logger
falhar, o erro será passado para o .catch()
retorno de chamada a seguir , mas não para o fail
retorno de chamada que acompanha o mesmo success
.
Aqui está um diagrama de fluxo de controle :
Para expressá-lo em código síncrono:
// 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);
}
O segundo log
(que é como o primeiro argumento .then()
) será executado apenas no caso de nenhuma exceção acontecer. O bloco rotulado ea break
declaração sentir um pouco estranho, este é realmente o que python tem try-except-else
para (leitura recomendada!).
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
O catch
criador de logs também tratará exceções da chamada do registrador de sucesso.
Tanto pela diferença.
Eu não entendo bem sua explicação quanto à tentativa e captura
O argumento é que geralmente você deseja capturar erros em todas as etapas do processamento e que não deve usá-lo em cadeias. A expectativa é que você tenha apenas um manipulador final que lide com todos os erros - enquanto, quando você usa o "antipadrão", os erros em alguns dos retornos de chamada não são tratados.
No entanto, esse padrão é realmente muito útil: quando você deseja lidar com erros que ocorreram exatamente nesta etapa e deseja fazer algo completamente diferente quando nenhum erro ocorreu - ou seja, quando o erro é irrecuperável. Esteja ciente de que isso está ramificando seu fluxo de controle. Claro, isso às vezes é desejado.
O que há de errado nisso?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Que você teve que repetir seu retorno de chamada. Você prefere
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});
Você também pode considerar usar .finally()
isso.
then().catch()
é mais legível, pois você não precisa procurar vírgula e investigar se esse retorno de chamada é para êxito ou falha na ramificação.