有什么不同?
The .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 for https://stackoverflow.com/q/16138232/1048572(推荐阅读!)。
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
The catch
logger 还将处理成功 logger 调用中的异常。
差异就这么多了。
我不太明白它对 try 和 catch 的解释
争论的焦点是,通常,您希望在处理的每个步骤中捕获错误,并且不应该在链中使用它。我们期望您只有一个最终处理程序来处理所有错误 - 而当您使用“反模式”时,某些 then 回调中的错误不会被处理。
然而,这种模式实际上非常有用:当你想要处理恰好在这一步中发生的错误,并且你想做一些事情时完全不同当没有发生错误时 - 即当错误无法恢复时。Be aware这是分枝你的控制流程。当然,有时这是需要的。
以下有什么问题吗?
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() http://bluebirdjs.com/docs/api/finally.html为了这。