我正在研究Angular RxJs模式,我不明白行为主体和可观察对象之间的区别。

根据我的理解,BehaviorSubject是一个可以随时间变化的值(可以订阅,订阅者可以接收更新的结果)。这似乎与可观察对象的目的完全相同。

什么时候使用可观察对象和行为主体?使用一个行为主体比使用一个可观察对象有好处吗?反之亦然?


当前回答

可观察对象和主体都是可观察对象,这意味着观察者可以跟踪它们。它们都有一些独特的特点。有三种类型的科目,每一种也有独特的特点。

您可以在stackblitz上找到实际示例。 (您需要检查控制台以查看实际输出)

观察

它们是冷的:当它们至少有一个观察者时,代码就会被执行。

创建数据副本:Observable为每个观察者创建数据副本。

单向:观察者不能给观察对象赋值(源/主)。

主题

它们很热:即使没有观察者,代码也会被执行,值也会被传播。

共享数据:在所有观察者之间共享相同的数据。

双向:观察者可以给观察对象赋值(源/主)。

如果你正在使用subject,那么你会错过所有在创建观察者之前传播的值。这就是重放主题

ReplaySubject

它们很热:即使没有观察者,代码也会被执行,值也会被传播。

共享数据:在所有观察者之间共享相同的数据。

双向:观察者可以给观察对象赋值(源/主)。+

重播消息流:无论您何时订阅重播主题,您都将收到所有的广播消息。

在Subject和ReplaySubject中,不能将初始值设置为observable。这就是行为主体…

BehaviorSubject

它们很热:即使没有观察者,代码也会被执行,值也会被传播。

共享数据:在所有观察者之间共享相同的数据。

双向:观察者可以给观察对象赋值(源/主)。+

重播消息流:无论您何时订阅重播主题,您都将收到所有的广播消息。

你可以设置初始值:你可以用默认值初始化可观察对象。

其他回答

你也可以像这样将一个主题更改为一个可观察对象:

 page = new BehaviorSubject<String|null>(null);
 actualPage:Observable<string> = new Observable()

this.page.next("hardware")
this.actualPage = this.page as Observable<any>;

可观察对象和主体都是可观察对象,这意味着观察者可以跟踪它们。它们都有一些独特的特点。有三种类型的科目,每一种也有独特的特点。

您可以在stackblitz上找到实际示例。 (您需要检查控制台以查看实际输出)

观察

它们是冷的:当它们至少有一个观察者时,代码就会被执行。

创建数据副本:Observable为每个观察者创建数据副本。

单向:观察者不能给观察对象赋值(源/主)。

主题

它们很热:即使没有观察者,代码也会被执行,值也会被传播。

共享数据:在所有观察者之间共享相同的数据。

双向:观察者可以给观察对象赋值(源/主)。

如果你正在使用subject,那么你会错过所有在创建观察者之前传播的值。这就是重放主题

ReplaySubject

它们很热:即使没有观察者,代码也会被执行,值也会被传播。

共享数据:在所有观察者之间共享相同的数据。

双向:观察者可以给观察对象赋值(源/主)。+

重播消息流:无论您何时订阅重播主题,您都将收到所有的广播消息。

在Subject和ReplaySubject中,不能将初始值设置为observable。这就是行为主体…

BehaviorSubject

它们很热:即使没有观察者,代码也会被执行,值也会被传播。

共享数据:在所有观察者之间共享相同的数据。

双向:观察者可以给观察对象赋值(源/主)。+

重播消息流:无论您何时订阅重播主题,您都将收到所有的广播消息。

你可以设置初始值:你可以用默认值初始化可观察对象。

app.component.ts

behaviourService.setName("behaviour");

behaviour.service.ts

private name = new BehaviorSubject("");
getName = this.name.asObservable();

constructor() {}

setName(data) {
    this.name.next(data);
}

custom.component.ts

behaviourService.subscribe(response=>{
    console.log(response);    //output: behaviour
});

BehaviorSubject

BehaviorSubject构建在与我们的ReplaySubject相同的功能之上,比如,hot,并重放先前的值。

BehaviorSubject又增加了一个功能,您可以给BehaviorSubject一个初始值。让我们继续,看看这段代码

import { ReplaySubject } from 'rxjs';

const behaviorSubject = new BehaviorSubject(
  'hello initial value from BehaviorSubject'
);

behaviorSubject.subscribe(v => console.log(v));

behaviorSubject.next('hello again from BehaviorSubject');

观察

首先,我们来看看创建常规Observable的最小API。有几种方法可以创建Observable。创建Observable的方法是实例化类。其他操作符可以简化这个步骤,但我们希望将实例化步骤与不同的Observable类型进行比较

import { Observable } from 'rxjs';

const observable = new Observable(observer => {
  setTimeout(() => observer.next('hello from Observable!'), 1000);
});

observable.subscribe(v => console.log(v));

Observable对象表示一个基于推的集合。

观察者和可观察接口为基于推送的通知提供了一种通用机制,也称为观察者设计模式。Observable对象表示发送通知的对象(提供者);Observer对象表示接收它们的类(观察者)。

Subject类继承了Observable和Observer,也就是说它既是一个观察者又是一个可观察对象。您可以使用主题订阅所有观察者,然后将主题订阅到后端数据源

var subject = new Rx.Subject();

var subscription = subject.subscribe(
    function (x) { console.log('onNext: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted'); });

subject.onNext(1);
// => onNext: 1

subject.onNext(2);
// => onNext: 2

subject.onCompleted();
// => onCompleted

subscription.dispose();

更多信息https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md