抓住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 完成
答案 0 :(得分:4)
是的,观察者可以收听多个Observable 但不是您尝试使用的方式。这可以通过使用Merge
,concat
运算符来实现。代码参考jsbin。
为什么您的代码无效?
我们为IObserver
的每次通话获得Observer.create
。一旦调用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);