说我有这个:
const a = new BehaviorSubject(0);
const b = new BehaviorSubject(0);
Observable.zip(
a.asObservable(),
b.asObservable()
)
.subscribe(v => {
// this will fire with [0,0]
// but I want it to also fire with [1,0]
});
a.next(1);
如何在订阅下一个函数中实现注释中的内容?
我相信我需要找到与Observable.zip()
不同的运算符,例如Observable.first()
。
答案 0 :(得分:2)
.zip()
仅在observables
的排放量可以实现时才有效。对于您的情况,因为0,0
已经被压缩,因此只会有一个这样的排放。如果您想要下一次发射,您的b
主题也必须发出一个值:
const a = new BehaviorSubject(0);
const b = new BehaviorSubject(0);
Observable.zip(
a.asObservable(),
b.asObservable()
)
.subscribe(v => {
// this will fire with [0,0]
// will fire only if both a and b has emisions.
// this also logs [1,1] because there is a b.next(1)
});
a.next(1);
b.next(1); // this step is crucial
如果要检测任意数量Observables
的任何更改,您必须使用Observable.combineLatest()
。
CombineLatest运算符的行为方式与Zip类似,但Zip只在每个压缩源Observable发出一个先前解压缩的项时才发出项目,只要任何源Observable发出一个项目,CombineLatest就会发出一个项目(这么久因为每个源Observable都发出了至少一个项目)。当任何源Observable发出一个项时,CombineLatest使用您提供的函数组合来自其他每个源Observable的最近发出的项,并从该函数发出返回值。