Promise.resolve() 函数如何工作?在将被拒绝的承诺作为参数传递给 Promise.resolve() 函数时,我得到两个不同的输出
How do Promise.resolve() function works? I am getting two different output on passing rejected promise as argument to Promise.resolve() function
我在 Promise.resolve() 函数的参数中传递了被拒绝的承诺。在第一种情况下,我通过函数 foo() 传递被拒绝的承诺,在第二种情况下,我通过在 Promise.resolve() 函数的参数中创建一个新的承诺来传递被拒绝的承诺。
案例 1:
function foo(){
return new Promise((resolve,reject)=>{
reject("Function foo failed");
});
}
Promise.resolve(foo)
.then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);
案例二:
Promise.resolve(
new Promise((resolve,reject)=>{reject("Failure");
})
)
.then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);
在情况 2 中,输出符合预期,输出为 "Failure"。但是在案例 1 中,输出是 "Success",但在这种情况下(案例 1),我期望 "Failure" 也是因为我传递了一个被拒绝的承诺。所以想问一下为什么case 1的输出是"Success"而不是"Failure"?
在第一种情况下,您传递的是对函数的引用。当您将不是承诺的内容传递给 Promise.resolve()
时,它会自动 returns 已解决的承诺。
要在第一种情况下获得预期的输出,请这样说:
Promise.resolve(foo())
- 注意 foo()
调用函数 foo 而不是 foo
只是传递一个引用。
我不确定是否有人已经完全解释了这里到底发生了什么,所以我将尝试对发生的事情进行更深入的讨论。
让我们看看 Promise.resolve()
实际做了什么。它创建一个新的承诺并获取您传递给它的价值,并将其作为新承诺的已解决价值。一个例外是,如果您传递给它的值是一个承诺本身,那么它会将这个承诺链接到新创建的承诺,并且新创建的承诺的值将跟踪您传递给它的承诺的值,包括它是解决还是拒绝。
所以,现在你的情况 1:
function foo(){
return new Promise((resolve,reject)=>{
reject("Function foo failed");
});
}
Promise.resolve(foo).then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);
您传递的值 Promise.resolve()
是函数引用 foo
。不调用该函数。因此,您得到的是一个新创建的承诺,其解析值是函数引用 foo
(本质上是指向函数 foo 的指针)。请注意 foo()
永远不会被调用。您只是在传递对函数 foo
.
的引用
现在,在你的情况下 2:
Promise.resolve(
new Promise((resolve,reject)=>{reject("Failure");})
).then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);
此处您传递的值 Promise.resolve()
是一个被拒绝的承诺。因此,Promise.resolve()
创建了一个新的 promise,它将跟踪该 promise 的值和 resolve/reject 状态。所以,你得到了预期的 "Failure"
输出。
如果我们在案例 3 中实际调用了 foo()
并将其 return 值传递给 Promise.resolve()
,如下所示:
function foo(){
return new Promise((resolve,reject)=>{
reject("Function foo failed");
});
}
// call foo() and pass its return value to Promise.resolve()
Promise.resolve(foo()).then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);
然后,您将获得预期的 "Failure" 输出。
我在 Promise.resolve() 函数的参数中传递了被拒绝的承诺。在第一种情况下,我通过函数 foo() 传递被拒绝的承诺,在第二种情况下,我通过在 Promise.resolve() 函数的参数中创建一个新的承诺来传递被拒绝的承诺。
案例 1:
function foo(){
return new Promise((resolve,reject)=>{
reject("Function foo failed");
});
}
Promise.resolve(foo)
.then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);
案例二:
Promise.resolve(
new Promise((resolve,reject)=>{reject("Failure");
})
)
.then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);
在情况 2 中,输出符合预期,输出为 "Failure"。但是在案例 1 中,输出是 "Success",但在这种情况下(案例 1),我期望 "Failure" 也是因为我传递了一个被拒绝的承诺。所以想问一下为什么case 1的输出是"Success"而不是"Failure"?
在第一种情况下,您传递的是对函数的引用。当您将不是承诺的内容传递给 Promise.resolve()
时,它会自动 returns 已解决的承诺。
要在第一种情况下获得预期的输出,请这样说:
Promise.resolve(foo())
- 注意 foo()
调用函数 foo 而不是 foo
只是传递一个引用。
我不确定是否有人已经完全解释了这里到底发生了什么,所以我将尝试对发生的事情进行更深入的讨论。
让我们看看 Promise.resolve()
实际做了什么。它创建一个新的承诺并获取您传递给它的价值,并将其作为新承诺的已解决价值。一个例外是,如果您传递给它的值是一个承诺本身,那么它会将这个承诺链接到新创建的承诺,并且新创建的承诺的值将跟踪您传递给它的承诺的值,包括它是解决还是拒绝。
所以,现在你的情况 1:
function foo(){
return new Promise((resolve,reject)=>{
reject("Function foo failed");
});
}
Promise.resolve(foo).then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);
您传递的值 Promise.resolve()
是函数引用 foo
。不调用该函数。因此,您得到的是一个新创建的承诺,其解析值是函数引用 foo
(本质上是指向函数 foo 的指针)。请注意 foo()
永远不会被调用。您只是在传递对函数 foo
.
现在,在你的情况下 2:
Promise.resolve(
new Promise((resolve,reject)=>{reject("Failure");})
).then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);
此处您传递的值 Promise.resolve()
是一个被拒绝的承诺。因此,Promise.resolve()
创建了一个新的 promise,它将跟踪该 promise 的值和 resolve/reject 状态。所以,你得到了预期的 "Failure"
输出。
如果我们在案例 3 中实际调用了 foo()
并将其 return 值传递给 Promise.resolve()
,如下所示:
function foo(){
return new Promise((resolve,reject)=>{
reject("Function foo failed");
});
}
// call foo() and pass its return value to Promise.resolve()
Promise.resolve(foo()).then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);
然后,您将获得预期的 "Failure" 输出。