有什么不同?
该.then()
调用将返回一个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
记录仪也将处理来自成功记录通话例外。
差异很大。
我对试捕不甚了解
论据是通常您希望在处理的每个步骤中都捕获错误,并且您不应该在链中使用它。期望您只有一个处理所有错误的最终处理程序-而当您使用“反模式”时,将不处理某些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()
为此使用。
then().catch()
更具可读性,因为您无需查找逗号并调查此回调是成功还是失败分支。