有什么不同?
该.then()
调用将返回一个Promise,如果回调引发错误,该Promise将被拒绝。这意味着,当您的成功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
语句感觉有点奇怪,这实际上是python所拥有try-except-else
的(推荐阅读!)。
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
该catch
记录仪也将处理来自成功记录通话例外。
区别就这么多。
我不太明白它对 try 和 catch 的解释
论点是,通常,您希望在处理的每个步骤中捕获错误,并且不应在链中使用它。期望您只有一个处理所有错误的最终处理程序 - 而当您使用“反模式”时,不会处理某些 then-callbacks 中的错误。
然而,这种模式实际上非常有用:当您想要处理恰好在这一步中发生的错误,并且您想要在没有发生错误时做一些完全不同的事情——即当错误不可恢复时。请注意,这是分支您的控制流。当然,这有时是需要的。
以下有什么问题?
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()
为此使用。