我不清楚主体和行为主体之间的区别。仅仅是因为一个行为主体有getValue()函数吗?
当前回答
我刚刚创建了一个项目来解释所有科目之间的区别: https://github.com/piecioshka/rxjs-subject-vs-behavior-vs-replay-vs-async
其他回答
BehaviorSubject在内存中保存被观察对象发出的最后一个值。一个普通的实验对象没有。
BehaviorSubject类似于缓冲区大小为1的ReplaySubject。
更新:有边缘用例可以区分这两者。https://medium.com/javascript-everyday/behaviorsubject-vs-replaysubject-1-beware-of-edge-cases-b361153d9ccf
TLDR: 如果您想在订阅时提供一个初始值,即使到目前为止还没有将任何内容推送到Subject,也可以使用BehaviorSubject。如果你想让观察者重放最后一个值,即使一个Subject已经关闭,也可以使用ReplaySubject(1)。
BehaviorSubject keeps in memory the last value that was emitted by the observable. A regular Subject doesn't. So we can update dynamic titles based on Behaviour Subject.
var bSubject= new Rx.BehaviorSubject(0); // 0 is the initial value
bSubject.subscribe({
next: (v) => console.log('observerA: ' + v) // output initial value, then new values on `next` triggers
});
bSubject.next(1); // output new value 1 for 'observer A'
bSubject.next(2); // output new value 2 for 'observer A', current value 2 for 'Observer B' on subscription
bSubject.subscribe({
next: (v) => console.log('observerB: ' + v) // output current value 2, then new values on `next` triggers
});
bSubject.next(3);
- With Output
这三个都很不同,让我再举几个例子,
const subject = new Rx.Subject();
const behaviorSubject = new Rx.BehaviorSubject([]);
const relaySubject = new Rx.ReplaySubject();
subject.next(1)
behaviorSubject.next(1);
behaviorSubject.next(2);
behaviorSubject.next(3);
relaySubject.next(1);
relaySubject.next(2);
relaySubject.next(3);
subject.subscribe(val => console.log('From Subject', val)); // this will not emits
behaviorSubject.subscribe(val => console.log('From BehaviorSubject', val)); // this will emits only last value
relaySubject.subscribe(val => console.log('From ReplaySubject', val)); // this will emit all values
输出截图
正如你所看到的,当我们在发出(i。e(…)),
主题-这将不会被发射 behaviorSubject -这将使用最后一个值触发一次 ReplaySubject -这将发射3次,因为我们有很多next()
所以区别主要在于订阅的位置,是在next()之前还是在next()之后。
在实际情况下,我们只在next() [i。E在我们向受试者填写数据后]。
BehaviourSubject
behavionsubject将返回订阅上的初始值或当前值
var bSubject= new Rx.BehaviorSubject(0); // 0 is the initial value
bSubject.subscribe({
next: (v) => console.log('observerA: ' + v) // output initial value, then new values on `next` triggers
});
bSubject.next(1); // output new value 1 for 'observer A'
bSubject.next(2); // output new value 2 for 'observer A', current value 2 for 'Observer B' on subscription
bSubject.subscribe({
next: (v) => console.log('observerB: ' + v) // output current value 2, then new values on `next` triggers
});
bSubject.next(3);
输出:
observerA: 0
observerA: 1
observerA: 2
observerB: 2
observerA: 3
observerB: 3
主题
主题没有返回订阅上的当前值。它只触发.next(value)调用并返回/输出该值
var subject = new Rx.Subject();
subject.next(1); //Subjects will not output this value
subject.subscribe({
next: (v) => console.log('observerA: ' + v)
});
subject.subscribe({
next: (v) => console.log('observerB: ' + v)
});
subject.next(2);
subject.next(3);
在控制台上输出如下信息:
observerA: 2
observerB: 2
observerA: 3
observerB: 3
一个行为主体在订阅后发出一个值,一个Subject no。
// Subject
const mySubject = new Rx.Subject().subscribe((v) => console.log(v)); // will return nothing
// BehaviorSubject
const myBehaviorSubject = new Rx.BehaviorSubject(666).subscribe((v) => console.log(v)); // will return 666 when subscription occurs
推荐文章
- React组件中使用TypeScript的默认属性值
- Angular 5 -复制到剪贴板
- 错误:在switch上没有指定name属性的窗体控件的值访问器
- TypeScript枚举对象数组
- Angular 2 - innerHTML样式
- Angular 2显示和隐藏一个元素
- 具有构造签名的接口如何工作?
- 'React'指的是一个UMD全局,但当前文件是一个模块
- Angular 2中的“component”不是一个已知的元素
- TypeScript错误:属性“X”在类型“Window”上不存在
- 我怎么能计算在打字稿2日期之间的时间
- 如何刷新一个数据源(mat-table)
- 正确使用错误
- 如何修复TS2322:“可以实例化与约束'对象'的不同子类型”?
- 如何在Angular中动态加载外部脚本?