Как правильно использовать Promise.all? - PullRequest
2 голосов
/ 11 июня 2019

Рассмотрим следующий код:

var result1;
var result1Promise = getSomeValueAsync().then(x => result1 = x);

var result2;
var result2Promise = getSomeValueAsync().then(x => result2 = x);

await Promise.all([result1Promise, result2Promise]);

// Are result1 and result2 guaranteed to have been set at this point?

console.log(result1 + result2); // Will this always work? Or could result1 and/or result2 be undefined because then() has not been executed yet?

Когда я использую метод then (), гарантированно ли он выполняется по порядку?Например, then () не будет выполняться сразу после разрешения Promise.all?

В Chrome все работает нормально, но мне действительно нужна гарантия того, что он всегда будет работать в соответствии с некоторыми спецификациями.?

Я бы предпочел не использовать Promise.all (...). Затем (некоторый обратный вызов), потому что тогда я снова использую обратные вызовы ...

Ответы [ 3 ]

5 голосов
/ 11 июня 2019

Promise.all разрешится только после разрешения всех обещаний в его массиве. Потому что ваши два Обещания имеют .then с:

.then(x => result1 = x);
.then(x => result2 = x);

Promise.all разрешится после выполнения обеих этих функций. Так что да, и result1, и result2 гарантированно будут определены (или, по крайней мере, назначены) при выполнении обратного вызова Promise.all.

Тем не менее, вместо присвоения внешним переменным, может иметь смысл определить переменные с помощью const , в то время как await в Promise.all:

const [result1, result2] = await Promise.all([getSomeValueAsync(), getSomeValueAsync()]);
4 голосов
/ 11 июня 2019

Вы можете напрямую использовать возвращаемое значение Promise.all:

const p1 = getSomeValueAsync();
const p2 = getSomeValueAsync();

const [result1, result2] = await Promise.all([p1, p2]);

console.log(result1 + result2);
2 голосов
/ 11 июня 2019

Да, они установлены. Разрешение result1Promise и result2Promise включает установку result1 и result2, поскольку само обещание полностью разрешается только при выполнении .then ().

Но если вы вообще хотите использовать обратные вызовы, вы должны структурировать свой код следующим образом:

const result1Promise = getSomeValueAsync();
const result2Promise = getSomeValueAsync();

const results = await Promise.all([result1Promise, result2Promise]);

console.log(results[0] + results[1]);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...