Was ist der Unterschied?
Der .then()
Anruf gibt ein Versprechen zurück, das abgelehnt wird, falls der Rückruf einen Fehler auslöst. Wenn Ihr Erfolg logger
fehlschlägt, wird der Fehler an den folgenden .catch()
Rückruf weitergeleitet, jedoch nicht an den fail
dazugehörigen Rückruf success
.
Hier ist ein Kontrollflussdiagramm :
Um es in synchronem Code auszudrücken:
// 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);
}
Das zweite log
(wie das erste Argument .then()
) wird nur ausgeführt, wenn keine Ausnahme aufgetreten ist. Der markierte Block und die break
Aussage fühlen sich ein wenig seltsam, das ist eigentlich das, was Python hat try-except-else
für (empfohlene Lektüre!).
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
Der catch
Logger behandelt auch Ausnahmen vom erfolgreichen Logger-Aufruf.
Soviel zum Unterschied.
Ich verstehe die Erklärung für das Versuchen und Fangen nicht ganz
Das Argument ist, dass Sie normalerweise Fehler in jedem Schritt der Verarbeitung abfangen möchten und dass Sie sie nicht in Ketten verwenden sollten. Die Erwartung ist, dass Sie nur einen letzten Handler haben, der alle Fehler behandelt. Wenn Sie das "Antipattern" verwenden, werden Fehler in einigen der damaligen Rückrufe nicht behandelt.
Dieses Muster ist jedoch tatsächlich sehr nützlich: Wenn Sie Fehler behandeln möchten, die genau in diesem Schritt aufgetreten sind, und etwas ganz anderes tun möchten, wenn kein Fehler aufgetreten ist - dh wenn der Fehler nicht behoben werden kann. Beachten Sie, dass dies Ihren Kontrollfluss verzweigt . Natürlich ist dies manchmal erwünscht.
Was ist daran folgendes falsch?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Dass Sie Ihren Rückruf wiederholen mussten. Du willst lieber
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});
Sie können dies auch in Betracht ziehen .finally()
.
then().catch()
ist besser lesbar, da Sie nicht nach Komma suchen und untersuchen müssen, ob dieser Rückruf erfolgreich ist oder fehlschlägt.