[英]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,但不能听你想要使用的方式。 这可以通过使用Merge
, concat
运算符来实现。 代码参考jsbin 。
为什么你的代码不起作用?
我们为Observer.create
每次调用都得到一个IObserver
。 一旦调用OnError或OnComplete,它将忽略OnNext的任何未来调用。
当我们使用一个观察者来订阅多个Observable时,在第一个observable终止/完成后(即当它触发OnError / OnCompleted时),观察者将无法为任何进一步订阅的observable工作。 因为来自第一个observable的终止消息将导致观察者忽略来自任何进一步订阅的observable的消息。
为了使你的问题起作用,你需要使用像merge
, concat
这样的运算符,它将在内部使用多个观察者,并且不会从除最后一个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.