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

posted @   Zhentiw  阅读(418)  评论(0编辑  收藏  举报
编辑推荐:
· 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工具
点击右上角即可分享
微信分享提示