然后用2个函数然后跟着catch来区别

时间:2014-08-16 23:06:38

标签: javascript node.js promise q

只是一个快速澄清的问题:

之间有什么区别
promiseGeneratingFunction.then(successHandler, errorHandler).done();

promiseGeneratingFunction.then(successHandler).catch(errorHandler).done();

由于

2 个答案:

答案 0 :(得分:6)

是的,这两个例子不同。

其他答案没有考虑链接的影响。文档说:

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函数要抛出异常(或返回被拒绝的承诺),则您的第一个示例没有附加错误处理程序(errorHandler仅附加到promiseGeneratingFunction,因此您的promise会从.done()抛出一个未被捕获的异常。在第二个例子中,successHandler引发的错误也会被errorHandler捕获,因为它在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);
}

答案 1 :(得分:-2)

  

当你只对处理错误感兴趣时,Q promises提供了一个失败的简写

如上所述,它只是简写