为什么在Promise.all中无法再次引用对承诺的引用?

时间:2018-12-29 09:44:33

标签: javascript promise

我试图在对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块中没有显示为解析状态?

2 个答案:

答案 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实例(已解析的实例)。承诺不会(也不会)返回并更新所有指向它们的变量以将其更改为已解析的值。