2017-09-01 130 views
0

試圖創建一個可以推送給所有訂閱者的可觀察對象,但是我遇到了多個訂閱的問題。這是我的理解,訂戶管理是爲我自動處理的。在下面的例子中,我的目標是記錄'a'和'b'。如何正確調用/管理我的可觀察項的後續訂閱?

let observer = null as any; 
let ob$ = new Observable<any>(ob => { 
    //this piece of code will be called twice, over-writing the original 
    observer = ob; 
}); 

ob$.do(() => console.log("a")).subscribe(); 
ob$.do(() => console.log("b")).subscribe(); //only 'b' is called 

observer.next(); 
observer.complete(); 

回答

0

的問題是您如何使用new Observable()(這等同於使用Observable.create())。

每當您訂閱ob$時,調用new Observable()的回調稱爲覆蓋observer的地方。然後,當您致電observer.next()時,您只需在第二個觀察者上撥打next即可。

換句話說"a"從不打印,因爲你永遠不會調用next上是內new Observable()創建時您訂閱ob$觀察。

一般來說,這不是一個好方法來使用new Observable()和你想要做的是更好的Subject

let observer = null as any; 
let subject = new Subject(); 
let ob$ = subject.asObservable(); 

ob$.do(() => console.log("a")).subscribe(); 
ob$.do(() => console.log("b")).subscribe(); //only 'b' is called 

subject.next(); 
subject.complete(); 

見現場演示:http://jsbin.com/hocagar/4/edit?js,console

此打印:

a 
b