【问题标题】:Emmit old value if SwitchMap has error in Rxjs如果 SwitchMap 在 Rxjs 中有错误,则发出旧值
【发布时间】:2020-03-26 09:59:10
【问题描述】:

我正在尝试从 rxjs 中的其他 web api 获取成员值。

我在一个带有 switchMap 的管道方法中做到了这一点。但是如果获取成员值有问题,那么我想跳过旧模型到下一个方法。

所以我不想在 switchMap 工作后返回 null。

这是我的代码:

    (this.repository.getData(`employeecards/list/${this.currentUser.companyId}`) as Observable<EmployeeCard[]>)
    .pipe(
      flatMap(emp => emp),
      tap(emp => emp),
      switchMap((empCard: EmployeeCard) => this.repository.getData(`cards/${empCard.cardId}`),(empCard, card) => ({ empCard, card }) ),
//second subscribe
      switchMap((emp: { empCard: EmployeeCard, card: LogisticCard }) => this.parraApiService.getBalanceByBarcode(emp.card.barcode),
        (emp: { empCard: EmployeeCard, card: LogisticCard }, apiRes: ParraApiResult) => {
          if (apiRes.response.isSuccess) {
//I use this subscribe only set to balance
            emp.empCard.balance = apiRes.response.data['balance'];
          }
          return emp.empCard
        }),
      catchError((e) => {
        return of([]); //I want to retun emp value 
      }),
      reduce((acc, value) => acc.concat(value), [])
    )

我该如何解决这个问题?

谢谢

【问题讨论】:

  • 返回 EMPTY 而不是 of([])
  • 它没有清空它的旧值。我想得到的EmployeeCard模型值

标签: javascript rxjs


【解决方案1】:

我认为你可以通过创建一个闭包来实现:

(this.repository.getData(`employeecards/list/${this.currentUser.companyId}`) as Observable<EmployeeCard[]>)
  .pipe(
    flatMap(emp => emp),
    tap(emp => emp),
    switchMap((empCard: EmployeeCard) => this.repository.getData(`cards/${empCard.cardId}`), (empCard, card) => ({ empCard, card })),
    switchMap(
      (emp: { empCard: EmployeeCard, card: LogisticCard }) => this.parraApiService.getBalanceByBarcode(emp.card.barcode)
        .pipe(
          map((emp: { empCard: EmployeeCard, card: LogisticCard }, apiRes: ParraApiResult) => {
            if (apiRes.response.isSuccess) {
              emp.empCard.balance = apiRes.response.data['balance'];
            }
            return emp.empCard
          }),
          catchError((e) => {
            // `emp` available because of closure
            return of(emp);
          }),
        )
    ),
    reduce((acc, value) => acc.concat(value), [])
  )

另外请注意,我放弃了 switchMap 的自定义 resultSelector,因为它可以很容易地替换为 map 运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2016-12-05
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多