我正在学习来自MDN文档的Promise。第一个示例演示了then
和catch
方法:
// We define what to do when the promise is resolved/fulfilled with the then() call,
// and the catch() method defines what to do if the promise is rejected.
p1.then(
// Log the fulfillment value
function(val) {
log.insertAdjacentHTML('beforeend', val +
') Promise fulfilled (<small>Async code terminated</small>)<br/>');
})
.catch(
// Log the rejection reason
function(reason) {
console.log('Handle rejected promise ('+reason+') here.');
});
文档说明
then
方法返回一个新的Promise,所以上述代码应该等同于:var p2 = p1.then(
// Log the fulfillment value
function(val) {
log.insertAdjacentHTML('beforeend', val +
') Promise fulfilled (<small>Async code terminated</small>)<br/>');
});
p2.catch(
// Log the rejection reason
function(reason) {
console.log('Handle rejected promise ('+reason+') here.');
});
那么,这是否意味着只有当从 p1.then
返回的 promise 被解析为拒绝时,才会调用catch
回调函数,而不是 promise p1
?我需要这样做:
p1.then( /* etc. */ );
// and for rejected resolutions
p1.catch( /* etc. */ );
如何在捕获 p1
的拒绝(rejection)时,不将 catch
方法链接到 then
方法中?
起初,我以为从 p1.then
返回的 Promise 与 p1
相同,就像 jQuery 大部分 API 的做法一样。但下面的示例清楚地表明这两个 Promise 是不同的。
var p1 = new Promise(function(resolve, reject) {
resolve("Success!");
});
console.log(p1);
// Promise { <state>: "fulfilled", <value>: "Success!" }
var p2 = p1.then(function(value) {
console.log(value);
});
// Success!
console.log(p2);
// Promise { <state>: "fulfilled", <value>: undefined }
此外,我在JSFiddle中尝试了这三种方法:
p1.then(onFulfilled).catch(onRejected);
p1.then(onFulfilled); p1.catch(onRejected);
p1.then(onFulfilled, onRejected);
这三种方法都可行。我可以理解后两种方法,但我的问题是:为什么第一种方法也能运行成功呢?
catch()
。 - Sirko.catch(onRejected)
看作是.then(null, onRejected)
(因为在早期的Promise实现中,它基本上就是这样 - 当你理解后两者时,你也应该理解第一个)。 - Jaromanda X.catch
,以至于我早期使用 Promises 时经常使用.then(null, onError)
这种类型的代码(尽管我的记忆可能有些混乱)。 - Jaromanda Xthen(null, onRejected)
的别名。 - Bergi