BehaviorSubject vs Observable?

新手上路,请多包涵

我正在研究 Angular RxJs 模式,但我不明白 BehaviorSubjectObservable 之间的区别。

据我了解,一个 BehaviorSubject 是一个可以随时间变化的值(可以订阅并且订阅者可以接收更新的结果)。这似乎与 Observable 的目的完全相同。

你什么时候会使用 ObservableBehaviorSubject ?在 BehaviorSubject 上使用 Observable 有什么好处,反之亦然?

原文由 Kevin Mark 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

BehaviorSubject 是一种主题,主题是一种特殊类型的可观察对象,因此您可以像订阅任何其他可观察对象一样订阅消息。 BehaviorSubject 的独特之处在于:

  • 它需要一个初始值,因为它必须始终在订阅时返回一个值,即使它没有收到 next()

  • 订阅后,它返回主题的最后一个值。常规的 observable 仅在收到 onnext 时触发

  • 在任何时候,您都可以使用 getValue() 方法在不可观察的代码中检索主题的最后一个值。

与可观察对象相比,对象的独特特征是:

  • 除了作为可观察对象之外,它还是一个观察者,因此除了订阅它之外,您还可以向主题发送值。

此外,您可以使用 BehaviorSubject 上的 asObservable() 方法从 BehaviorSubject 主题中获取可观察对象。

Observable 是 Generic,而 BehaviorSubject 在技术上是 Observable 的子类型,因为 BehaviorSubject 是具有特定品质的 observable。

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.asObservable()SubjectBehaviorSubject 创建一个 observable。

唯一的区别是您不能使用 next() 方法将值发送到可观察对象。

在 Angular 服务中,我会将 BehaviorSubject 用于数据服务,因为 Angular 服务通常在组件之前初始化,并且行为主体确保使用该服务的组件接收到最后更新的数据,即使自组件订阅此数据以来没有新的更新也是如此。

原文由 Shantanu Bhadoria 发布,翻译遵循 CC BY-SA 4.0 许可协议

Observable:每个观察者的结果不同

一个非常非常重要的区别。由于 Observable 只是一个函数,它没有任何状态,所以对于每一个新的 Observer,它都会一次又一次地执行 observable 创建代码。这导致:

为每个观察者运行代码。如果它是一个 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                          ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

原文由 Vamshi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题