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

Posted

技术标签:

【中文标题】如何等待 JavaScript/TypeScript 中的 Promise 列表?【英文标题】:How to await multiple Promises? 【发布时间】:2016-09-18 12:55:00 【问题描述】:

我有以下代码,fileStatsPromises 属于Promise<Stats>[]foobar 都是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);
)();

【问题讨论】:

您的代码非常不完整。您能否提供一个可以实际运行的示例(包括stat 的定义)?除此之外,如果fileStatsPromises 是一个 Promises 数组,那么您应该可以选择第二个选项 (bar)。 这似乎是由打字稿引起的错误,因为当我登录bar时控制台实际上输出了10 'hello'。 【参考方案1】:

这是正确的:

const bar = await Promise.all(promiseArray);

await Promise.all([...]) 接受一个 Promises 数组并返回一个结果数组。

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

你也可以解构生成的数组:

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

【讨论】:

@Everyone_Else 问题也要求使用 TypeScript。另外,这是有效的 JS (ES2017),适用于最新版本的 Node.js 7 和 8。如果您需要旧版本的 JS,您可以通过 Babel 之类的工具运行您的源代码。 Promise.allSettled 在这种情况下可能也值得一提。文档here【参考方案2】:

请使用Promise.all()。 请参考官方文档https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Promise/all

【讨论】:

以上是关于如何等待 JavaScript/TypeScript 中的 Promise 列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何让异步/等待等待我的嵌套数组填充

如何使用 QProcess 等待子进程?

颤振:如何使用“等待”等待其他 BLoC 事件完成

如何等待发货?

调用condition_variable等待函数时线程如何等待?

等待我的班级初始化(或如何等待 Future 完成)?