[RxJS] Subject: an Observable and Observer hybrid
This lesson teaches you how a Subject is simply a hybrid of Observable and Observer which can act as a bridge between the source Observable and multiple observers, effectively making it possible for multiple observers to share the same Observable execution.
var observable = Rx.Observable.interval(1000).take(5); var observerA = { next: function (x) { console.log('A next ' + x); }, error: function (err) { console.log('A error ' + err); }, complete: function () { console.log('A done'); }, }; var observerB = { next: function (x) { console.log('B next ' + x); }, error: function (err) { console.log('B error ' + err); }, complete: function () { console.log('B done'); }, }; observable.subscribe(observerA); setTimeout( () => { observable.subscribe(observerB); },2000 )
In the code above, we have two 'observers', because we call subscribe twice:
observable.scbscribe(ObserverA);
observable.scbscribe(ObserverB);
If we want to have one observer, so we need to call subscribe only once.
For that we can build a bridgeObservers, which will loop though the observers:
const observable = Rx.Observable.interval(1000).take(5); const ObserverA = { next: function(x){ console.log("A next " + x) }, error: function(x){ console.error("A error " + x) }, complete: function(){ console.log("A Done") }, }; const ObserverB = { next: function(x){ console.log("B next " + x) }, error: function(x){ console.error("B error " + x) }, complete: function(){ console.log("B Done") }, }; const BridgeObservers = { next: function(x){ this.observers.forEach( o => o.next(x) ) }, error: function(x){ this.observers.forEach( o => o.error(x) ) }, complete: function(){ this.observers.forEach( o => o.complete() ) }, observers: [], addObserver: function(observer){ this.observers.push(observer) } }; observable.subscribe(BridgeObservers); BridgeObservers.addObserver(ObserverA); setTimeout(function(){ BridgeObservers.addObserver(ObserverB); }, 2000)
And this partten:
observable.subscribe(BridgeObservers);
BridgeObservers.addObserver(ObserverA); // BirdegeObservers.subscribe(ObserverA)
is actually 'subject' partten, works both as Observer and Observable.
Subject:
const observable = Rx.Observable.interval(1000).take(5); const ObserverA = { next: function(x){ console.log("A next " + x) }, error: function(x){ console.error("A error " + x) }, complete: function(){ console.log("A Done") }, }; const ObserverB = { next: function(x){ console.log("B next " + x) }, error: function(x){ console.error("B error " + x) }, complete: function(){ console.log("B Done") }, }; const subject = new Rx.Subject(); /*const BridgeObservers = { next: function(x){ this.observers.forEach( o => o.next(x) ) }, error: function(x){ this.observers.forEach( o => o.error(x) ) }, complete: function(){ this.observers.forEach( o => o.complete() ) }, observers: [], subscribe: function(observer){ this.observers.push(observer) } };*/ observable.subscribe(subject); subject.subscribe(ObserverA); //BridgeObservers.subscribe(ObserverA); setTimeout(function(){ subject.subscribe(ObserverB); // BridgeObservers.subscribe(ObserverB); }, 2000)
In the end, ObserverA and ObserverB share one single observer.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具