如何在嵌套的 Observable 中 return 一个 Observable?

How to return an Observeble within nested Observables?

我有两个嵌套的 observable,第一个 observable 提供了一个 ID,该 ID 作为参数传递给第二个 observable userTypeID

目标是 return 一个基于 actionType 的 Observable,它可以是 viewedit 以便做这样的事情。

// returns view object 
getPresentationFields('view').subscribe(data => console.log(data)); 

// returns edit object
getPresentationFields('edit').subscribe(data => console.log(data)); 

但是,由于我已经在 getPresentationFields(...) 中订阅了 Observables,所以我不能订阅上面写的函数本身。

getPresentationFields(actionType: string) {
    this.customerService.getUserByID(this.id).subscribe(user => {
        this.presConfigService.getPresConfig(user.userTypeID).pipe(
            flatMap((configs) => configs),          // ----[obj1, obj2, obj3]----
            filter((configs) => configs.show)      // ----obj1----obj2----obj3----
        ).subscribe(() => {
            if(actionType == 'view'){
                // Return View Observable
            }else if(actionType == 'edit'){
                // Return Edit Observable
            }
        });
    });
}

如何根据传递给 getPresentationFields('view')getPresentationFields('edit') 的参数 return 一个 Observable?

不需要在getPresentationFields代码中订阅,直接通过Observable即可。

粗略示例(不确定 return 需要 view/edit 的哪一部分配置)

function getPresentationFields(actionType: string) {
  return this.customerService
    .getUserByID(this.id)
    .pipe(
      switchMap(user => this.presConfigService.getPresConfig(user.userTypeID)),
      flatMap((configs) => configs),
      filter((configs) => {
        if(actionType == 'view'){
          return configs.show;
        }else if(actionType == 'edit'){
          return configs.edit;
        }
      })
    )
}

或者你可以在更高的地方有一个 if-else:

function getPresentationFields(actionType: string) {
  const result$ = this.customerService
    .getUserByID(this.id)
    .pipe(
      switchMap(user => this.presConfigService.getPresConfig(user.userTypeID))
    );

 if(actionType == 'view'){
    return result$.pipe(
      // ... get view data
    );
  } else if(actionType == 'edit'){
    return result$.pipe(
      // ... get edit data
    )
  }
}

通常,您只需要在消费结果的地方订阅 Observable。

甚至可能发生您实际上并未在代码中订阅,而是将可观察对象传递到外部某处,例如 angular | asyncredux effects !

所以大多数情况下,您将使用 switchMap, mergeMap, combineLatest 等运算符来处理您的数据并将其传递给订阅,这将变得尽可能薄。