结合BehaviorSubject和Zip Observables的rxjs

时间:2016-06-27 20:31:51

标签: d3.js rxjs

我有以下js代码。

var a = new Rx.BehaviorSubject(1);
var b = new Rx.BehaviorSubject(2);
var c = new Rx.BehaviorSubject(3);

var total = Rx.Observable.zip(a,b,c, d3.sum);

var observer1 = Rx.Observer.create(
    function (x) {
        console.log('this is an oberservation from A: ' + x);
    }
);

var observer2 = Rx.Observer.create(
    function (x) {
        console.log('this is an oberservation from TOTAL: ' + x);
    }
);

var subscription1 = a.subscribe(observer1)
var subscription2 = total.subscribe(observer2)

a.onNext(5)

目标是当a更新时,total会更新,并且我们可以看到observer2中打印的结果。但是,当我运行它时的输出是:

this is an oberservation from A: 1
this is an oberservation from TOTAL: 0
this is an oberservation from A: 5

为什么我没有看到新的总数,为什么最初的总错?

修改

当我用d3.sum作为reducer函数替换function(a,b,c){return a + b + c}时,至少初始TOTAL分数是正确的。我不知道这是否是一个相关问题,但如果是,我想知道出了什么问题。

1 个答案:

答案 0 :(得分:1)

使用时可以使用

var total = Rx.Observable.combineLatest(a,b,c, function(a,b,c){return a + b + c})

等待abc之前的代码在将消息传递给observer2之前至少更改了一次。

另请参阅docs