如何在JavaScript/TypeScript中等待Promise列表?

Zen*_*Zen 20 javascript async-await typescript ecmascript-next

我有以下的代码,fileStatsPromises是的Promise<Stats>[],无论是foobarPromise<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);
Run Code Online (Sandbox Code Playgroud)

编辑:一个最小的例子.

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);
})();
Run Code Online (Sandbox Code Playgroud)

截图

Wes*_*y92 46

这是对的:

const bar = await Promise.all(promiseArray);
Run Code Online (Sandbox Code Playgroud)

await Promise.all([...]) 获取Promise数组并返回一组结果.

bar 将是一个数组: ['hello', ..., 'hello']

您还可以解构生成的数组:

const [bar1, ..., bar10] = await Promise.all(promiseArray);
console.log(bar1); // hello
console.log(bar7); // hello
Run Code Online (Sandbox Code Playgroud)

  • @Everyone_Else这个问题也要求TypeScript.此外,这是有效的JS(ES2017),适用于最新版本的Node.js 7和8.如果您需要较旧版本的JS,您可以通过像Babel这样的东西运行您的源代码. (19认同)