繁体   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