Qual è la differenza?
La .then()
chiamata restituirà una promessa che verrà rifiutata nel caso in cui la richiamata generi un errore. Ciò significa che, in caso di esito logger
negativo, l'errore verrebbe trasmesso al seguente .catch()
callback, ma non al fail
callback associato success
.
Ecco un diagramma di flusso di controllo :
Per esprimerlo in codice sincrono:
// 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);
}
Il secondo log
(che è come il primo argomento .then()
) verrà eseguito solo nel caso in cui non si sia verificata alcuna eccezione. Il blocco etichettati e la break
dichiarazione si sentono un po 'strano, questo è in realtà ciò che Python ha try-except-else
per (lettura consigliata!).
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
Il catch
logger gestirà anche le eccezioni dalla chiamata del logger di successo.
Questo per la differenza.
Non capisco bene la sua spiegazione per quanto riguarda il tentativo di cattura
L'argomento è che di solito si desidera rilevare errori in ogni fase dell'elaborazione e che non è necessario utilizzarlo in catene. L'aspettativa è che tu abbia un solo gestore finale che gestisca tutti gli errori, mentre, quando usi "antipattern", gli errori in alcuni dei callback non vengono gestiti.
Tuttavia, questo modello è in realtà molto utile: quando si desidera gestire gli errori che si sono verificati esattamente in questo passaggio e si desidera fare qualcosa di completamente diverso quando non si è verificato alcun errore, ovvero quando l'errore è irrecuperabile. Essere consapevoli del fatto che questo sta ramificando il flusso di controllo. Certo, a volte questo è desiderato.
Cosa c'è di sbagliato in questo il seguente?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Che hai dovuto ripetere il tuo callback. Preferisci
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});
Si potrebbe anche considerare l'utilizzo .finally()
per questo.
then().catch()
è più leggibile, in quanto non è necessario cercare la virgola e indagare è questo callback per il ramo di successo o fallimento.