簡體   English   中英

Rx JS將觀察者訂閱到多個Observable

[英]Rx JS Subscribe Observer to multiple Observables

抓住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完成

是的, 觀察者可以收聽多個Observable,但不能你想要使用的方式。 這可以通過使用Mergeconcat運算符來實現。 代碼參考jsbin

為什么你的代碼不起作用?

我們為Observer.create每次調用都得到一個IObserver 一旦調用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM