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

sak*_*asi 0 javascript node.js promise q

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

两者之间有什么区别吗?

promiseGeneratingFunction.then(successHandler, errorHandler).done();
Run Code Online (Sandbox Code Playgroud)

promiseGeneratingFunction.then(successHandler).catch(errorHandler).done();
Run Code Online (Sandbox Code Playgroud)

谢谢

log*_*yth 6

是的,这两个例子是不同的.

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

A sugar method, equivalent to promise.then(undefined, onRejected).
Run Code Online (Sandbox Code Playgroud)

所以是的,.catch相当于.then.但这不是你的例子所显示的.

你比较

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

// VS

promiseGeneratingFunction.then(successHandler).catch(errorHandler).done();
Run Code Online (Sandbox Code Playgroud)

如果我们使用记录的比较打破第二个例子,它实际上是:

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

// VS

promiseGeneratingFunction.then(successHandler).then(undefined, errorHandler).done();
Run Code Online (Sandbox Code Playgroud)

这两者在处理错误方面表现不同.successHandler如果生成的promise成功,两个示例都会调用,errorHandler如果promise失败,则调用它们,因此它们非常相似.差异来自他们如何处理错误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(){});
Run Code Online (Sandbox Code Playgroud)

如果你的successHandler函数抛出一个异常(或者返回一个被拒绝的promise),那么你的第一个例子没有附加错误处理程序(errorHandler只附加到promiseGeneratingFunction,所以你的promise会抛出一个未捕获的异常.done().在第二个例子中,抛出的错误successHandler也会陷入困境,errorHandler因为它与承诺链相距更远.

等效的同步代码是这样的:

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);
}
Run Code Online (Sandbox Code Playgroud)