只是一个快速澄清的问题:
有什么区别吗
promiseGeneratingFunction.then(successHandler, errorHandler).done();
和
promiseGeneratingFunction.then(successHandler).catch(errorHandler).done();
?
谢谢
最佳答案
是的,这两个例子是不同的。
其他答案没有考虑链接的影响。文档说:
A sugar method, equivalent to promise.then(undefined, onRejected).
所以,是的,.catch
相当于 .then
。但这不是您的示例所显示的。
你比较
promiseGeneratingFunction.then(successHandler, errorHandler).done();
// VS
promiseGeneratingFunction.then(successHandler).catch(errorHandler).done();
如果我们使用记录的比较来分解第二个示例,它实际上是:
promiseGeneratingFunction.then(successHandler, errorHandler).done();
// VS
promiseGeneratingFunction.then(successHandler).then(undefined, errorHandler).done();
这两者在处理错误的方式上表现不同。如果生成的 Promise 成功,这两个示例都会调用 successHandler
,如果 Promise 失败,则会调用 errorHandler
,因此它们非常相似。区别在于它们在 successHandler
中处理错误的方式。
// this is a fulfilled promise since the thrown error was handled
Promise.resolve().then(function(){ throw new Error(); }).catch(function(){});
// this is a rejected promise
Promise.resolve().then(function() { throw new Error() }, function(){});
如果您的 successHandler
函数要抛出异常(或返回被拒绝的 Promise),则您的第一个示例没有附加错误处理程序(errorHandler
仅附加到 promiseGenerateFunction
,因此您的 Promise 将从 .done()
抛出未捕获的异常。在第二个示例中,从 successHandler
抛出的错误也将在 errorHandler
中捕获,因为它被绑定(bind)在 promise 链的更下游。
等效的同步代码如下所示:
var error = null;
var result;
try {
result = func();
} catch (err){
error = err;
}
if (error){
errorHandler(error);
} else {
successHandler(result);
}
// VS
try {
var result = func();
successHandler(result);
} catch (err){
errorHandler(err);
}
关于javascript - q then 与 2 个函数和 then 后跟 catch 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25344825/