有什么不同?
该.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 and 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()
这个。