Rx JS将观察者订阅到多个Observable

时间:2014-07-03 13:52:50

标签: javascript functional-programming reactive-programming rxjs

抓住Rx JS的表面我最后得到了以下片段:

    var observer1 = Rx.Observer.create(
         function (x) {
             console.log('Next: ' + x);
         },
         function (err) {
             console.log('Error: ' + err);
         },
         function () {
             console.log('Completed');
         }
     );  

     var observer2 = Rx.Observer.create(
         function (x) {
             console.log('Next: ' + x); 
         },  
         function (err) {
             console.log('Error: ' + err);   
         },  
         function () {
             console.log('Completed');   
         }   
     );  


     var source1 = Rx.Observable.return(1);
     var source2 = Rx.Observable.return(2);

     var subscription1 = source1.subscribe(observer1);
     var subscription2 = source2.subscribe(observer1);

输出: 下一个:1 完成

JS BIN代码参考:http://goo.gl/DiHdWu

将同一个观察者订阅到两个流只会产生第一个数据。但是当订阅其他观察者时,事情会按预期进行。有人可以解释一下发生了什么吗?

     var subscription1 = source1.subscribe(observer1);
     var subscription2 = source2.subscribe(observer2);

输出: 下一个:1 已完成 下一个:2 完成

1 个答案:

答案 0 :(得分:4)

是的,观察者可以收听多个Observable 但不是您尝试使用的方式。这可以通过使用Mergeconcat运算符来实现。代码参考jsbin

为什么您的代码无效?

我们为IObserver的每次通话获得Observer.create。一旦调用OnError或OnComplete,它将忽略OnNext的任何未来调用。

当我们使用一个观察者来订阅多个Observable时,在第一个observable终止/完成后(即当它触发OnError / OnCompleted时),观察者将不会对任何进一步订阅的observable起作用。因为来自第一个observable的终止消息将导致观察者忽略来自任何进一步订阅的observable的消息。

要使您的问题起作用,您需要使用mergeconcat之类的运算符,它们将在内部使用多个观察者,并且不会从除最后一个Observable之外的任何observable传递完成消息(OnError / OnCompleted)对外观察者来说。

//Triggers observer1 for both observables(source1 & source2)
var subscription = source1.concat(source2).subscribe(observer1);

//Triggers observer2 for both observables(source1 & source2)
var subscription = source1.merge(source2).subscribe(observer2);