我有一个基本上是这样的代码块:
async getExportData() {
const exportStats: Object[] = [];
this.mongoRepositories.forEach( async (repo, key) => {
await repo.connect();
let queryResult = await repo.getData();
exportStats.push(...queryResult);
repo.close();
});
return exportStats;
}
this.mongoRepositories
是Map<string, MongoRepo>
。
如何返回完整的exportStats
数组?当前写的方式,在块的底部为空。
编辑:由于在地图上的迭代和迭代数组的迭代差异而导致的潜在重复不同。更新问题标题以反映。
我在不使用Map.prototype.forEach
的情况下尝试了迭代,但是即使我找到了许多示例,我也找不到可以编译的方法。事实证明,我必须从es5
将目标更新为es6
,并在tsconfig.json
文件中启用downlevelIteration
。然后编译。
然后,我按如下进行了重组:
async getExportStats() {
return await this.queryMongo();
}
private async queryMongo() {
const exportStats: Object[] = [];
for (const [key, repo] of this.mongoRepos.entries()) {
await repo.connect();
const queryResult = await repo.getExportStats();
exportStats.push(...queryResult);
}
return exportStats;
}
这解决了问题。
不要在 for
循环中 await
。如果要改进吞吐量,请使用Array.prototype.map()
和Promise.all()
并同时连接到每个存储库并查询您的数据。最后,使用Array.prototype.flat()
将每个结果传播到从查询结果集合中返回的对象的一数组。
async getExportData() {
const queryResults: Object[][] = await Promise.all(
Array.from(this.mongoRepositories).map(async ([key, repo]) => {
await repo.connect();
const queryResult: Object[] = await repo.getData();
repo.close();
return queryResult;
})
);
return queryResults.flat();
}