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().take();

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);
},
)

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().take();

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);
}, )

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().take();

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);
}, )

In the end, ObserverA and ObserverB share one single observer.

最新文章

  1. 软件测试之loadrunner学习笔记-01事务
  2. re正则表达式5_*
  3. xcode 怎么样在发布release版本的时候 不输出log
  4. javascript基础DOM操作
  5. td太多内容显示...
  6. 引用 字库编码Unicode相关知识
  7. AntData.ORM框架 之 DotnetCore
  8. 给ASP.NET Core Web发布包做减法
  9. nodejs-websocket 的简单用法和安装
  10. 常用MQ及其原理
  11. Hadoop项目实战-用户行为分析之应用概述(一)
  12. 『转』统计一个日志文件里,单词出现频率的shell脚本
  13. appium框架感悟
  14. js中三种定义变量的方式const, var, let的区别。
  15. 数据库与java的连接
  16. go语言中的函数
  17. tomcat,很多时候,可以在服务server.xml中可以实现一些效果
  18. 自定义事件 js
  19. 05-oralce转换函数
  20. 【[SHOI2009]会场预约】

热门文章

  1. vue -- 脚手架之webpack.dev.conf.js
  2. 关于exports 和 module.exports
  3. CHARINDEX,REPLACE,LEFT+四大系统函数+模糊查询
  4. go channel实现
  5. 洛谷 P1757 通天之分组背包
  6. Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容
  7. collapse折叠
  8. vue中watch函数的用法
  9. echarts如何设置背景图的颜色
  10. CISP/CISA 每日一题 16