我知道
promise 3
被拒绝是因为它解决了一个 已经被拒绝的承诺 (promise 2
),但是 promise 3
怎么会拒绝 promise 4
?, 幕后发生了什么?
Promise.resolve(6) // promise 1
.then(function(data) {
console.log('then 1:' + data);
return Promise.reject(new Error('ups - rejected')); // Does it "jump" to the first catch() it finds?
}) // promise 2 - this promise is resolved with a **rejected promise**
.then(function (data) {
console.log('then 2:' + data);
return data + 1;
}) // promise 3
.then(function (data) {
console.log('then 3:' + data);
return data + 1;
}) // promise 4
.catch(function(error) { // catch of promise 4?
console.log(error);
});
输出:
then 1:6
index.js:57 Error: ups - rejected
at index.js:46:27
then()
的文档一样,then
的第一个参数提供了当 Promise 被解决时要做什么,第二个参数提供了当 promise 被拒绝时要做什么。
onFulfilled
和 onRejected
处理程序都提到当参数不存在或不是函数时,参数被视为恒等函数:
onFulfilled:“如果它不是一个函数,它在内部被替换为一个身份函数(
),它只是向前传递实现值。”(x) => x
onRejected:“如果它不是一个函数,它在内部被替换为一个抛出函数(
),抛出它收到的拒绝原因。”(x) => { throw x; }
因为 promise 2 被拒绝,并且因为创建 promise 3 的
then
处理程序没有第二个参数,所以 promise 3 只采用与 promise 2 相同的解决方案。与 promise 4 相同,因为 promise 3 被拒绝并且 then
只有第一个参数。
因为 promise 4 的分辨率与 promise 3 和 promise 2 相匹配,它近似于“跳到下一个捕获”(或跳到下一个两个参数
then
),但这只是因为你看不到 promise 3 和 promise 4 reject with与 promise 2 相同的结果。如果您将它们保存到一个变量中并稍后检查它们,您会看到它们被拒绝,并显示您在第一个 then
块中设置的消息。