observable1.pipe(
withLatestFrom(observable2),
.. do something with both emitted observable values
)
withLatestFrom
的问题是,如果observable2
在observable1
之前没有发出任何事件,那么它就是一个死代码。我应该如何修改代码以确保do something with both emitted observable values
在调用之前至少发出一次可观察值?也许在forkJoin
周围有一些包装器?
如果你正在寻找一个可移植的操作符而不是combineLatest
函数,你可以使用RxJS的combineLatestWith
。
observable1.pipe(
combineLatestWith(observable2),
// ... do something with both emitted observable values
)
看起来像是combinellatest操作符的用例。此操作符接受一个可观察对象数组,并等待每个数组至少发出一次。一旦所有的可观察对象都发出了,操作符就会第一次发出。之后,它会在任何可观察对象发出时发出。
你可以用startWith()
强制第一次发射,你可以根据你的需要将它应用于可观察到的1和2。
observable1.pipe(
withLatestFrom(observable2.startWith(null)),
.. do something with both emitted observable values
)
NgRx提供了一个可以参考的concatLatestFrom
操作符实现。它包装了withLatestFrom
以产生您(和许多其他人)期望的行为,并且可能比combineLatestWith
在语义上更清晰。这也适用于RxJS版本7之前:
source1$.pipe(
concatLatestFrom(source2$),
...
)