如果我有以下代码,promise
b
最初将是 unresolved 因为它不知道是否会调用 resolve()
或 rejected()
也因为它没有与之关联的 promise(它不是解决了另一个承诺),对吧?
let b = new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() < 0.5) {
resolve("all good");
} else {
reject(new Error("ugh"));
}
}, 5000);
});
let q = Promise.resolve(b);
https://tc39.es/ecma262/#sec-promise-objects
如果承诺已解决或已“锁定”,则承诺已解决 匹配另一个承诺的状态。
根据规格
我正在尝试理解已解决/未解决
是的,一个承诺是未解决的1直到
resolve()
(或reject()
)被调用。
在您的示例中,
b
未解决五秒钟,而 q
立即解决并且永远不会(明显)未解决,假设2 Promise.resolve(b)
与 相同
new Promise((resolve, reject) => {
// here, the promise (that will be assigned to "q") is unresolved
resolve(b);
// now it is resolved
})
1:这与“待定”不同。
2:实际上有一个优化,如果它是一个承诺,
Promise.resolve
只是返回它的参数,所以 b === q
和同一个对象显然不会有不同的状态。所以我们假设天真的实现总是创建一个新的承诺并立即将其解析为传递的值。