Observable.zip但获取第一个值,不要等待所有值

时间:2018-02-06 05:35:24

标签: observable rxjs5 angular2-observables

说我有这个:

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()

1 个答案:

答案 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的最近发出的项,并从该函数发出返回值。