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

, если вы используете angularjs & amp; aspnet / mvc, чтобы получить json-файлы, вы должны разрешить тип mime в web config

<staticContent>
    <remove fileExtension=".json" />
    <mimeMap fileExtension=".json" mimeType="application/json" />
  </staticContent>
0
задан Trevor 28 February 2019 в 22:37
поделиться

2 ответа

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

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

0
ответ дан Trevor 28 February 2019 в 22:37
поделиться

Не 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
ответ дан Patrick Roberts 28 February 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: