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 没有太大区别,但如果它丰富了一个对象(无论嵌套有多深),同样的模式将适用。
我有以下 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 没有太大区别,但如果它丰富了一个对象(无论嵌套有多深),同样的模式将适用。