【问题标题】:Observable instead Promise with async\awaitObservable 代替 Promise 与 async\await
【发布时间】:2020-02-05 01:27:00
【问题描述】:

我有一个方法可以返回 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');
    }

有读取权限

返回布尔值

groupingGuaranteesMetaDataCategories

返回数组。

我尝试使用 reduce、forkJoin、map,但我无法理解如何将 async/await 重写为 Observable 正确,即不订阅循环中的每个 hasReadPermission 方法?

【问题讨论】:

  • 将 async/await 与 Observables 一起使用并没有错。你甚至可以从 promise (Observable.fromPromise(getFilteredGuaranteesByPermissions())) 创建一个 observable。或者,你可以看看这个问题:stackoverflow.com/questions/49596641/…

标签: javascript angular rxjs


【解决方案1】:

您希望等到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);
  });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 2023-03-10
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多