4

劃傷我VE結束了與下面的代碼段在Rx JS的表面:的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); 

OUTPUT: 下一步:1 完成

JS BIN代碼參考:http://goo.gl/DiHdWu

向兩個流訂閱相同的觀察者只會產生第一個數據。然而,當訂閱其他觀察者時,事情按預期進行。有人可以解釋發生了什麼嗎?

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

OUTPUT: 下一頁:1 完成 下一頁:2 完成

回答

4

是的,一個觀察者可以監聽多個觀測量而不是你要使用的方式。這可以通過使用Merge,concat運營商來實現。代碼參考jsbin

爲什麼你的代碼不起作用?

對於Observer.create的每個呼叫,我們得到一個IObserver。一旦調用OnError或OnComplete,它將忽略任何未來的OnNext調用。

當我們使用一個觀察者來訂閱多個觀察對象時,在第一個觀察對象終止/完成後(即觸發OnError/OnCompleted時),觀察者將無法對任何進一步訂閱的觀察對象起作用。因爲來自第一個observable的終止消息將導致觀察者忽略來自任何進一步訂閱的observable的消息。

對於您的問題,您需要使用運營商如mergeconcat這將在內部使用多個觀察員和除最後一個可觀察不傳遞任何可觀完成消息(的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);