有什么区别吗?
.then()
调用将返回一个 Promise,如果回调函数引发错误,则该 Promise 将被拒绝。这意味着当成功的logger
失败时,错误会传递给以下的 .catch()
回调,而不是与success
一起使用的fail
回调。
下面是一个控制流程图:
![then catch 链的控制流程图](https://istack.dev59.com/wX5mr.webp)
同步代码表达如下:
then: {
try {
var results = some_call();
} catch(e) {
logger.log(e);
break then;
}
logger.log(results);
}
第二个log
(类似于传递给.then()
的第一个参数)只会在没有异常发生的情况下执行。标记块和break
语句感觉有点奇怪,这实际上是Python使用try-except-else
来解决这个问题的原因(推荐阅读!)。
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
catch
日志记录器还将处理成功日志调用引发的异常。
至此,就差不多了。
我不太理解 try 和 catch 的解释
有人认为通常情况下,您希望在处理过程的每个步骤中捕获错误,并且不应在链式操作中使用它。期望只有一个最终处理程序来处理所有错误。而当您使用“反模式”时,则无法处理某些 then-callback 中的错误。
然而,这种模式实际上非常有用:当您希望处理发生在当前步骤中的错误,并且当没有错误发生时要执行完全不同的操作时,即当错误是不可恢复的时。请注意,这会分支您的控制流程。当然,有时这是想要的。
以下代码有什么问题?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
你需要重复回调。你更想要什么?
some_promise_call()
.catch(function(e) {
return e;
})
.done(function(res) {
logger.log(res);
});
你也可以考虑使用.finally()
来实现这个功能。
then().catch()
更易读,因为您不需要查找逗号并确定回调函数是成功还是失败分支。 - Krzysztof Safjanowski.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
或者.then(function(res) { logger.log(res) }).catch( function(err) { logger.log(err) })
。 - Krzysztof Safjanowski.catch
时,您不知道哪一步引起了问题 - 是在最后一个then
内部还是在承诺链的其他地方。因此,它确实具有自己的缺点。 - vitaly-tsome_promise_call() .then(function fulfilled(res) { logger.log(res) }, function rejected(err) { logger.log(err) })
- Shane Rowatt