你所要做的是不完全可能這樣,但你基本上有兩個選擇去,既涉及Subject
的用法:
1)數據的人工發射
const obs$ = Rx.Observable.of("stream1");
const subj$ = new Rx.Subject();
Rx.Observable.merge(obj$, subj$)
.subscribe(
x => console.log('Next: ' + x),
x => console.log('Error: ' + x),
() => console.log('Complete')
);
subj$.next("stream2");
subj$.next("stream3");
但是:在這種情況下,完整將永遠不會被調用,因爲Subject
永遠不會自行完成 - 所以如果您需要觸發您的complete
處理程序,則必須添加手冊subj$.complete();
到最後。
2)多播通過主題
const obs$ = Rx.Observable.of("stream1");
const subj$ = new Rx.Subject();
subj$.subscribe(
x => console.log('Next: ' + x),
x => console.log('Error: ' + x),
() => console.log('Complete')
);
obs$.subscribe(x => subj$.next(x));
const obs2$ = Rx.Observable.of("stream2");
obs2$.subscribe(x => subj$.next(x));
在這種情況下的Subject
將基本上充當「代理」只會傳播的數據,但沒有無差錯或完全的觸發器。
這兩種解決方案都不是很「好」 - 但也許你可以更好地概述你的用例,我相信有一個適當的解決方案,它不涉及任何複雜的解決方法。
如果你只是想有一種方式來繼續提供數據形成永久觀察的,你應該使用BehaviorSubject
- 它工作的方式,你可以在它發出的數據並訂閱它在同時:
class Service {
public data$ = new BehaviorSubject(someInitialDataOrNull);
public getData() {
makeSomeHttpCall()
.subscribe(data => data$.next(data));
}
}
class Component {
constructor() {
theService.data$.subscribe(data => console.log(data));
}
}
這裏是對BehaviorSubject
的舊文檔的鏈接(它基本上還是以同樣的方式期待onNext
是next
現在,等...)
非常感謝您的回答。我的想法是,服務將提供來自api或其他來源的數據的可觀察性。我的其他組件正在訂閱它,因此它需要從一開始就可以觀察到,並且數據可用時會饋送其他組件。這個目的的正確模式是什麼? – LeniM
我已經更新了答案 – olsn
非常感謝。你釘了它! – LeniM