Наблюдаемый вместо Promise с асинхронным \ await - PullRequest
3 голосов
/ 07 октября 2019

У меня есть метод, который возвращает обещание и работает с концепцией асинхронности / ожидания в цикле.

async getFilteredGuaranteesByPermissions(): Promise<GuaranteesMetaData[]> {
    const result = [];
    for (const guarantees of this.guaranteesMetaData) {
        if (await this.permissionService.hasReadPermission(guarantees.key)) {
            result.push(guarantees);
        }
    }
    return this.groupingGuaranteesMetaDataCategories(result);
}

groupingGuaranteesMetaDataCategories(guarantees: GuaranteesMetaData[]): GuaranteesMetaData[] {
        return _.groupBy(guarantees, 'category');
    }

hasReadPermission

return boolean

groupingGuaranteesMetaDataCategories

возвращаемый массив.

Я пытался использовать Reduce, forkJoin, map, но я не могу понять, как переписать async / await в Observable правильный, который не подписывается на всеМетод hasReadPermission в цикле?

1 Ответ

3 голосов
/ 07 октября 2019

Вы хотите подождать, пока массив results не будет заполнен, прежде чем делать еще один асинхронный вызов groupingGuaranteesMetaDataCategories(). * Для этого можно использовать

forkJoin () .

getFilteredGuaranteesByPermissions(): Promise<GuaranteesMetaData[]> {
  const result = [];
  for (const guarantees of this.guaranteesMetaData) {
      result.push(
        from(this.permissionService.hasReadPermission(guarantees.key)).pipe(
          map(hasPermission => hasPermission ? guarantess : null)
        )
      );
  }

  return forkJoin(result).subscribe((result) => {
    result = result.filter(value => value !== null);
    return this.groupingGuaranteesMetaDataCategories(result);
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...