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

У меня есть следующий код: 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);
})();

Скриншот


person Zen    schedule 21.05.2016    source источник
comment
Ваш код довольно неполный. Не могли бы вы привести пример, который действительно можно запустить (включая определение stat)? Кроме того, если fileStatsPromises - это массив обещаний, вам подойдет второй вариант (bar).   -  person nils    schedule 21.05.2016
comment
Кажется, это ошибка, вызванная машинописным текстом, потому что консоль фактически выводит 10 «привет», когда я регистрирую bar.   -  person Zen    schedule 21.05.2016


Ответы (2)


Это правильно:

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
person Westy92    schedule 07.10.2016
comment
Не уверен, почему это было поддержано - использование await приводит к тому, что это даже не является допустимым синтаксисом js ... - person Everyone_Else; 03.08.2017
comment
@Everyone_Else вопрос также касается TypeScript. Кроме того, это действительный JS (ES2017) и работает в последних версиях Node.js 7 и 8. Если вам нужна более старая версия JS, вы можете запустить свой источник через что-то вроде Babel. - person Westy92; 03.08.2017

Пожалуйста, используйте Promise.all(). См. Официальную документацию https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

person null1941    schedule 24.02.2019