#javascript #node.js #asynchronous #promise
Вопрос:
У меня есть следующий код, fileStatsPromises
есть Promise<Stats>[]
, оба foo
и bar
есть Promise<Stats>[]
. Как правильно их ждать? Я хочу добраться <Stats>[]
.
const files = await readDir(currentDir);
const fileStatsPromises = files.map(filename => path.join(currentDir, filename)).map(stat);
const foo = await fileStatsPromises;
const bar = await Promise.all(fileStatsPromises);
ПРАВКА: минимальный пример.
function makePromise() {
return Promise.resolve("hello");
}
const promiseArray = [];
// const promiseArray = [] as Promise<string>[];
for (let i = 0; i < 10; i ) {
promiseArray.push(makePromise());
}
(async () => {
const foo = await promiseArray;
const bar = await Promise.all(promiseArray);
})();
Комментарии:
1. Ваш код довольно неполон. Не могли бы вы привести пример, который действительно можно запустить (включая определение
stat
)? Кроме того, еслиfileStatsPromises
есть множество обещаний, вы должны быть в порядке со своим вторым вариантом (bar
).2. Похоже, это ошибка, вызванная машинописным текстом, потому что консоль фактически выводит 10 «привет», когда я вхожу
bar
в систему .
Ответ №1:
Это правильно:
const bar = await Promise.all(promiseArray);
await Promise.all([...])
принимает массив обещаний и возвращает массив результатов.
bar
будет массивом: ['hello', ..., 'hello']
Вы также можете деконструировать полученный массив:
const [bar1, ..., bar10] = await Promise.all(promiseArray);
console.log(bar1); // hello
console.log(bar7); // hello
Комментарии:
1. @Everyone_Else вопрос также требует машинописного текста. Плюс это действительно JS (ES2017) и работает в последних версиях Node.js 7 и 8. Если вам нужна более старая версия JS, вы можете запустить свой исходный код через что-то вроде Babel.
2.
Promise.allSettled
вероятно, также стоит упомянуть в этом контексте. Документация здесь
Ответ №2:
Пожалуйста, используйте Promise.all()
. Пожалуйста, обратитесь к официальной документации https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all