Rxjs 主体和行为主体有什么区别?

Rxjs 主体和行为主体有什么区别?,rxjs,behaviorsubject,subject,Rxjs,Behaviorsubject,Subject,我不清楚主题和行为主题之间的区别。只是一个BehaviorSubject具有getValue()函数吗?一个BehaviorSubject拥有一个值。订阅后,它会立即发出值。主体没有价值 主题示例(使用RxJS 5 API): 控制台输出将为空 行为主体示例: const subject = new Rx.BehaviorSubject(0); subject.next(1); subject.subscribe(x => console.log(x)); 控制台输出:1 此外: Be

我不清楚
主题
行为主题
之间的区别。只是一个
BehaviorSubject
具有
getValue()
函数吗?

一个BehaviorSubject拥有一个值。订阅后,它会立即发出值。主体没有价值

主题示例(使用RxJS 5 API):

控制台输出将为空

行为主体示例:

const subject = new Rx.BehaviorSubject(0);
subject.next(1);
subject.subscribe(x => console.log(x));
控制台输出:1

此外:

  • BehaviorSubject
    应使用初始值创建:new
    Rx.BehaviorSubject(1)
  • 如果希望主题包含多个值,请考虑
    ReplaySubject
行为主体 行为主体将在订阅时返回初始值或当前值

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
主题 Subject不返回订阅时的当前值。它仅在
时触发。下一步(值)
调用并返回/输出

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

我刚刚创建了一个项目,解释了所有主题之间的区别:


行为主体
将可观察对象发出的最后一个值保存在内存中。常规的
主题
不会


BehaviorSubject
类似于缓冲区大小为1的
ReplaySubject

更新:有一些边缘用例可以区分这两种情况

TLDR:
如果您希望在订阅时提供初始值,即使到目前为止还没有向主题推送任何内容,也可以使用BehaviorSubject。如果要将最后一个值回放给观察者,即使主题已关闭,也可以使用ReplaySubject(1)。

这可能有助于理解

import * as Rx from 'rxjs';

const subject1 = new Rx.Subject();
subject1.next(1);
subject1.subscribe(x => console.log(x)); // will print nothing -> because we subscribed after the emission and it does not hold the value.

const subject2 = new Rx.Subject();
subject2.subscribe(x => console.log(x)); // print 1 -> because the emission happend after the subscription.
subject2.next(1);

const behavSubject1 = new Rx.BehaviorSubject(1);
behavSubject1.next(2);
behavSubject1.subscribe(x => console.log(x)); // print 2 -> because it holds the value.

const behavSubject2 = new Rx.BehaviorSubject(1);
behavSubject2.subscribe(x => console.log('val:', x)); // print 1 -> default value
behavSubject2.next(2) // just because of next emission will print 2 
行为主体在订阅后发出一个值,而主体

//主题
const mySubject=new Rx.Subject().subscribe((v)=>console.log(v));//什么也不还
//行为主体
const myBehaviorSubject=new Rx.BehaviorSubject(666.subject).subscribe((v)=>console.log(v));//订阅发生时将返回666

这也更正确:“Behavior subject将在订阅时返回初始值或当前值”是比“Behavior subject持有一个值”更好的解释。我将上面的代码放在Stackblitz上:observerB:3在哪里?@OPV observerB:3在那里,而您调用
subject。下一步(3)那么你的意思是你必须在subject.next()之前订阅subject才能工作吗?@eric for subject,是的。这就是区别。请注意,您必须将第一个值传递给BehaviorSubject的构造函数;)如果我们用布尔值创建主题,即使主题发出仪式??常量主题=新主题();subject.next(true);如果有帮助:主题=事件-行为主题=状态;
import * as Rx from 'rxjs';

const subject1 = new Rx.Subject();
subject1.next(1);
subject1.subscribe(x => console.log(x)); // will print nothing -> because we subscribed after the emission and it does not hold the value.

const subject2 = new Rx.Subject();
subject2.subscribe(x => console.log(x)); // print 1 -> because the emission happend after the subscription.
subject2.next(1);

const behavSubject1 = new Rx.BehaviorSubject(1);
behavSubject1.next(2);
behavSubject1.subscribe(x => console.log(x)); // print 2 -> because it holds the value.

const behavSubject2 = new Rx.BehaviorSubject(1);
behavSubject2.subscribe(x => console.log('val:', x)); // print 1 -> default value
behavSubject2.next(2) // just because of next emission will print 2