RxJs 运算符简化:switchMap、combineLatest

RxJs Operator simplification : switchMap, combineLatest

我有以下 RxJS 订阅:

combineLatest([obs1$, obs2$])
  .pipe(
     filter(val=>!!val[0] && !!val[1]), // no null value on both
     switchMap(([val1, val2]) => combineLatest([of(v1), getObs3$(v2)]))
   )
   .subscribe(([val1, val3]) => { ... });

代码工作正常,但感觉很麻烦。我很确定将 switchMap 转换为带有 of() 运算符的 combineLatest 是可以改进的。

注意:为了调用 getObs3$(v2),我需要首先确定 obs1$ 中的值。另外,我确实需要订阅中的 val1,因为我稍后会用到它。

有人知道如何优化这个吗?

一种可能:

combineLatest([obs1$, obs2$]).pipe(

  // no null value on both
  filter(val=>!!val[0] && !!val[1]),

  switchMap(([val1, val2]) => getObs3$(val2).pipe(
    map(val3 => [val1,val3])
  ))

).subscribe(([val1, val3]) => { ... });

这是您会经常看到的一般模式。这里我们将 val3 插入到一个元组中,因此它与 combine latest 没有太大区别,但如果它丰富了一个对象(无论嵌套有多深),同样的模式将适用。