Как мне дождаться списка обещаний в JavaScript/машинописном тексте?

#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