我在 Promise.resolve() 函数的参数中传递了被拒绝的 promise 。在第一种情况下,我通过函数 foo() 传递被拒绝的 promise ,在第二种情况下,我通过在 Promise.resolve() 函数的参数中创建一个新的 promise 来传递被拒绝的 promise 。
案例一:
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 中,输出是“成功”,但在这种情况下(案例 1)我预计会出现“失败”,因为我传递了一个被拒绝的 promise 。所以我想问一下为什么case 1的输出是“Success”而不是“Failure”?
最佳答案
我不确定是否有人已经完全解释了这里到底发生了什么,所以我将尝试对发生的事情进行更深入的讨论。
让我们看看 Promise.resolve()
实际上做了什么。它创建一个新的 promise 并获取您传递给它的值(value),并将其作为新 promise 的已解决值(value)。一个异常(exception)是,如果您传递给它的值是一个 promise 本身,那么它会将这个 promise 链接到新创建的 promise ,并且新创建的 promise 的值将跟踪您传递给它的 promise 的值,包括它是解决还是拒绝。
那么,现在您的情况 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
。不调用该函数。因此,您得到的是一个新创建的 promise ,其解析值是函数引用 foo
(本质上是指向函数 foo 的指针)。请注意,永远不会调用 foo()
。您只是传递对函数 foo
的引用。
现在,对于您的情况 2:
Promise.resolve(
new Promise((resolve,reject)=>{reject("Failure");})
).then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);
此处您传递给 Promise.resolve()
的值是一个被拒绝的 promise 。因此,Promise.resolve()
创建了一个新的 promise ,它将跟踪该 promise 的值和解决/拒绝状态。因此,您得到了预期的 "Failure"
输出。
如果我们在案例 3 中实际调用了 foo()
并将其返回值传递给 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");}
);
然后,您将获得预期的“失败”输出。
关于javascript - Promise.resolve() 函数如何工作?在将被拒绝的 promise 作为 Promise.resolve() 函数的参数传递时,我得到两个不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57451033/