我试图在对Promise进行解析之前将对Promise的引用分配给变量。我曾期望,当Promise.all中的Promise.promise解析时,对同一Promise的引用也将被解析,但是它仍然是一个Promise对象,而不是已解析的值
function returnPromise(out) {
return new Promise((resolve, reject) => {
setTimeout(() => {
return resolve(out);
}, 1000);
})
}
let test1;
let promiseStack = [];
for (let i = 0; i < 10; i++) {
let prom = returnPromise(i);
promiseStack.push(prom);
if (i === 1) {
test1 = prom; // Set 1 of the references to a promise to a variable
}
}
Promise.all(promiseStack).then((results) => {
console.log(results); // An array of 10 values (0 to 9)
console.log(test1); // A promise object - expected this to be = 1
})
我的问题是,为什么test1值在Promise.all块中没有显示为解析状态?
答案 0 :(得分:2)
test1 = prom; // Set 1 of the references to a promise to a variable
您将承诺分配给test1
。
您永远不会为test1
分配另一个值。
当您通过以下方式检查test1
时:
console.log(test1); // A promise object - expected this to be = 1
...仍然是一个诺言。
只有在执行明确检查承诺的已解决值的操作时(例如,查看传递给您传递给then
的函数的参数),您才能看到承诺的已解决值。
promise对象本身永远不会转换为解析值。
test1.then(value => console.log(value)); // This will be 1
答案 1 :(得分:1)
我的问题是,为什么test1值在Promise.all块中没有显示为解析状态?
是的。当时是一个 resolved 承诺(而且在Chrome的devtools中也是如此;不过,您不能在代码中直接观察到该状态)。在将变量test1
分配给promise实例后,代码中的任何内容都不会更新,因此自然地,它仍然引用promise实例(已解析的实例)。承诺不会(也不会)返回并更新所有指向它们的变量以将其更改为已解析的值。