如何从具有map.prototype.foreach块的函数中返回值,该块可进行异步调用



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

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

最新更新