承诺: 然后 vs 然后 + 赶上

以下两个密码有什么不同吗?

myPromise.then(function() {
console.log('success');
}).catch(function() {
console.log('error');
});


myPromise.then(function() {
console.log('success');
}, function() {
console.log('error');
});

我知道 thencatch返回已解决或已拒绝的新承诺,并在回调中返回值。但是我在网上看到了这两个代码,我很好奇这两个代码之间的真正区别。

51294 次浏览

在当前代码中,它们的作用相同,因为 console.log('success');不会失败。

但是,如果你写这样的东西..。

myPromise.then(function() {
// Some error may happen
throw('An exception that would be caught');
}).catch(function() {
console.log('error');
});
// Is the same as this, the errHandle tries to catch any unhandled error
// from previous result.
myPromise.then(func, null).then(null, errHandle);




myPromise.then(function() {
// Some error may happen
throw('An unhandled exception.');
}, function() {
// This won't log the error if it happens in the
// some error may happen block.
console.log('error');
});
// Is the same as this, the errHandle will handle errors from previous result,
// but it won't handle errs in func.
myPromise.then(func, errHandle)

第二个表单无法捕捉到这个错误,而第一个表单可以。

测试片段:

// An function that may error and throw exception.
function funcThatThrows(test) {
throw(`oops - error in test ${test}`);
}
function errHandler(exception) {
console.log('We got an exception: ', exception);
}
// Expect: We got an exception:  oops - error in test 1
Promise.resolve(1).then(funcThatThrows).catch(errHandler);
// Is the same as below, the errHandler tries to catch any unhandled error
// from previous result.
// Expect: We got an exception:  oops - error in test 2
Promise.resolve(2).then(funcThatThrows, null).then(null, errHandler);


// If put the function and handler in the same then, the exception won't be caught.
// Expect: Uncaught (in promise) oops - error in test 3
Promise.resolve(3).then(funcThatThrows, errHandler);