我正在研究 Angular RxJs 模式,我不明白 a 和 an 之间的区别。BehaviorSubject
Observable
根据我的理解,a 是一个可以随时间变化的值(可以订阅,订阅者可以接收更新的结果)。这似乎与 .BehaviorSubject
Observable
你什么时候会使用 vs a ?使用超过或反之亦然有什么好处吗?Observable
BehaviorSubject
BehaviorSubject
Observable
行为主体是一种主题类型,主题是一种特殊类型的可观察量,因此您可以像订阅任何其他可观察对象一样订阅消息。BehaviorSubject 的独特功能是:
next()
onnext
getValue()
与可观察量相比,主体的独特特征是:
此外,您可以使用 上的方法从行为主体获取可观察量。asObservable()
BehaviorSubject
Observable 是泛型的,从技术上讲是 Observable 的子类型,因为 BehaviorSubject 是具有特定品质的 Observable。BehaviorSubject
BehaviorSubject的示例:
// Behavior Subject
// a is an initial value. if there is a subscription
// after this, it would get "a" value immediately
let bSubject = new BehaviorSubject("a");
bSubject.next("b");
bSubject.subscribe(value => {
console.log("Subscription got", value); // Subscription got b,
// ^ This would not happen
// for a generic observable
// or generic subject by default
});
bSubject.next("c"); // Subscription got c
bSubject.next("d"); // Subscription got d
示例 2 与常规主题:
// Regular Subject
let subject = new Subject();
subject.next("b");
subject.subscribe(value => {
console.log("Subscription got", value); // Subscription won't get
// anything at this point
});
subject.next("c"); // Subscription got c
subject.next("d"); // Subscription got d
可以从两者创建可观察量,也可以使用 创建可观察量。Subject
BehaviorSubject
subject.asObservable()
唯一的区别是您无法将值发送到可观察的 using 方法。next()
在 Angular 服务中,我会使用数据服务,因为角度服务通常在组件和行为主体之前初始化,确保使用服务的组件收到上次更新的数据,即使自组件订阅此数据以来没有新的更新。BehaviorSubject
一个非常非常重要的区别。由于 Observable 只是一个函数,它没有任何状态,所以对于每个新的 Observer,它都会一次又一次地执行可观察的创建代码。这导致:
代码为每个观察者
运行。如果是 HTTP 调用,则会为每个观察者调用它
这会导致重大错误和效率低下
BehaviorSubject(或Subject)存储观察者的详细信息,只运行一次代码并将结果提供给所有观察者。
前任:
JSBin: http://jsbin.com/qowulet/edit?js,console
// --- Observable ---
let randomNumGenerator1 = Rx.Observable.create(observer => {
observer.next(Math.random());
});
let observer1 = randomNumGenerator1
.subscribe(num => console.log('observer 1: '+ num));
let observer2 = randomNumGenerator1
.subscribe(num => console.log('observer 2: '+ num));
// ------ BehaviorSubject/ Subject
let randomNumGenerator2 = new Rx.BehaviorSubject(0);
randomNumGenerator2.next(Math.random());
let observer1Subject = randomNumGenerator2
.subscribe(num=> console.log('observer subject 1: '+ num));
let observer2Subject = randomNumGenerator2
.subscribe(num=> console.log('observer subject 2: '+ num));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.3/Rx.min.js"></script>
输出:
"observer 1: 0.7184075243594013"
"observer 2: 0.41271850211336103"
"observer subject 1: 0.8034263165479893"
"observer subject 2: 0.8034263165479893"
观察如何使用为每个观察器创建不同的输出,但为所有观察器提供相同的输出。这很重要。Observable.create
BehaviorSubject
总结了其他差异。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Observable ┃ BehaviorSubject/Subject ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Is just a function, no state ┃ Has state. Stores data in memory ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Code run for each observer ┃ Same code run ┃
┃ ┃ only once for all observers ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Creates only Observable ┃Can create and also listen Observable┃
┃ ( data producer alone ) ┃ ( data producer and consumer ) ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Usage: Simple Observable with only ┃ Usage: ┃
┃ one Obeserver. ┃ * Store data and modify frequently ┃
┃ ┃ * Multiple observers listen to data ┃
┃ ┃ * Proxy between Observable and ┃
┃ ┃ Observer ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
可观察和主体都是可观察的,这意味着观察者可以跟踪它们。它们都有一些独特的特征。有3种类型的主题,每种主题也有独特的特征。
您可以在堆栈闪电战中找到实际示例。
(您需要检查控制台才能看到实际输出)
Observables
他们很冷:当代码至少有一个观察者时,代码就会被执行。
创建数据副本:可观察为每个观察者创建数据副本。
单向:观察者不能将值分配给可观察对象(原点/主节点)。
Subject
它们很热:即使没有观察者,代码也会被执行,值也会被广播。
分享数据:相同的数据在所有观察者之间共享。
双向:观察者可以将值分配给可观察对象(原点/主节点)。
如果您使用的是主题,那么您会错过在创建观察器之前广播的所有值。所以来了重播主题
ReplaySubject
它们很热:即使没有观察者,代码也会被执行,值也会被广播。
分享数据:相同的数据在所有观察者之间共享。
双向:观察者可以将值分配给可观察对象(原点/主节点)。加
重播消息流:无论您何时订阅重播主题,您都将收到所有广播消息。
在“主题”和“重播主题”中,不能将初始值设置为可观察。所以来了行为主体…
BehaviorSubject
它们很热:即使没有观察者,代码也会被执行,值也会被广播。
分享数据:相同的数据在所有观察者之间共享。
双向:观察者可以将值分配给可观察对象(原点/主节点)。加
重播消息流:无论您何时订阅重播主题,您都将收到所有广播消息。
您可以设置初始值:您可以使用默认值初始化可观察量。
模板简介:该模板名称为【在JavaScript 中BehaviorSubject vs Observable区别?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。