Как вернуть значение из функции, имеющей блок Map.prototype.forEach, который выполняет асинхронные вызовы? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть блок кода, который по сути выглядит следующим образом:

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массив?Как написано в данный момент, в нижней части блока оно пустое.

РЕДАКТИРОВАТЬ: Этот вопрос оказался отличным от потенциального дубликата из-за различий в итерации по карте и итерации по массиву.Обновление заголовка вопроса для отражения.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Не 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();
}
0 голосов
/ 01 марта 2019

Я пытался выполнить итерацию без использования 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;
}

Это решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...