Почему вторая ссылка на обещание не разрешается в Promise.all? - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь присвоить ссылку на Обещание до его разрешения переменной.Я ожидал, что, когда обещание разрешается в Promise.all, ссылка на это же обещание также будет разрешена, но вместо этого это все еще объект обещания, а не разрешенное значение

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 голосов
/ 29 декабря 2018

Мой вопрос: почему значение test1 не отображается так, как разрешено в блоке Promise.all?

Это так.Это разрешенное обещание в этот момент (и оно показывается как таковое в devtools Chrome; хотя вы не можете непосредственно наблюдать это состояние в коде).Ничто в вашем коде не обновляет переменную test1 после того, как вы назначите ей экземпляр обещания, поэтому, естественно, он все еще ссылается на экземпляр обещания (разрешенный).Обещания не (и не могут) вернуться и обновить все переменные, которые указывают на них, чтобы изменить их на разрешенное значение.

0 голосов
/ 29 декабря 2018
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).

Сам объект обещания никогда не преобразуется в разрешенное значение.

test1.then(value => console.log(value)); // This will be 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...