[英]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.