如何从具有进行异步调用的Map.prototype.forEach块的函数返回值?

时间:2019-02-28 21:57:34

标签: typescript async-await

我有一段基本上是这样的代码:

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.mongoRepositoriesMap<string, MongoRepo>

如何返回完整的exportStats数组?当前编写的方式,在该块的底部为空。

编辑:由于对Map进行迭代和对Array进行迭代的差异,导致该问题与潜在的重复项有所不同。更新问题标题以反映出来。

2 个答案:

答案 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();
}