我有一段基本上是这样的代码:
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进行迭代和对Array进行迭代的差异,导致该问题与潜在的重复项有所不同。更新问题标题以反映出来。
答案 0 :(得分:0)
我尝试不使用Map.prototype.forEach
进行迭代,但是即使找到了很多示例,我也找不到能够编译的方法。原来,我必须将目标从es6
更新为es5
,并在我的downlevelIteration
文件中启用tsconfig.json
。然后编译。
然后我按如下所示重新构造了块:
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;
}
此问题已解决。
答案 1 :(得分:0)
不要在await
循环中for
。如果要提高吞吐量,请使用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();
}