使用Observable取代Promise和async/await

3
我有一个返回promise的方法,使用了async/await概念在循环中运行。
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

返回布尔值。

groupingGuaranteesMetaDataCategories

返回数组。

我尝试使用reduce、forkJoin和map,但我不理解如何正确地将async/await重写为Observable,以便在循环中不订阅每个hasReadPermission方法。


在使用Observables时,同时使用async/await没有任何问题。你甚至可以从Promise创建一个Observable(Observable.fromPromise(getFilteredGuaranteesByPermissions()))。或者,你可以参考这个问题:https://dev59.com/_1UL5IYBdhLWcg3w67sR - ChrisG
1个回答

4
你需要等待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);
  });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接