事件和行为主题之间的区别

时间:2018-01-02 10:48:17

标签: angular ionic2 rxjs

Ionic 3中Events与Angular" Rxjs"中的BehaviorSubject之间有何区别?例如,在订阅事件发出时,"当某些事件发生时,全局发出"?

2 个答案:

答案 0 :(得分:2)

之间存在一些差异,但我认为值得关注的是这些差异。

BehaviourSubject发出他的"事件"当你订阅它时。

因此,如果您创建一个新的BehaviourSubject实例并订阅它,即使您没有使用next(),也会执行其中的代码,如下所示:

var subject = new Rx.BehaviorSubject(0); // 0 is the initial value

subject.subscribe((value) => {
  // this code will fire when you subscribe to this new subject, then'll fire again for every next(value) you call
  console.log('observerA: ' + value);
});

事件'只有当您使用.publish()方法时才会触发。

BehaviourSubject不是全局的。

由于您需要在组件中创建它的新实例并订阅它,因此它只能在此组件中工作。使用事件,您始终可以从任何组件订阅和发布,因为发布时的第一个参数和事件是标识符,您发布时将触发对此标识符的任何订阅。

BehaviourSubject存储传递给它的最后一个值。

您可以随时使用主题的getValue()方法获取传递给它的最后一个值。使用事件是不可能的,但您可以创建变量,每次发布事件时,此变量都会保留传递的值。

希望这有帮助。

答案 1 :(得分:2)

要了解BehaviorSubject,需要花时间来消化主题如何工作以及它们与普通Observable的区别。

Per Ben Lesh (a major contributor on Rxjs):“Subject和Observable之间更重要的区别是主体有状态,它保留了一个观察者列表。”

因此,一个主体保留了状态。为了进一步阅读,我鼓励您read the distinction between "Hot" observables and "Cold" observables

BehaviorSubject与Subject的不同之处在于订阅它的任何消费者都会立即向其发出BehaviorSubject的最新值。

所以,假设我们有一个应用程序,它有一个BehaviorSubject,可以发出当前用户的用户名。假设我们的HomePage组件订阅了此BehaviorSubject。一旦初始化该订阅(在HomePage中),将向其发出用户名值。时间流逝并且仍然是同一个用户登录。现在只说AspectPage已经订阅了这个相同的BehaviorSubject。在此期间,用户名没有更改,但无论如何,当初始化此新订阅时,将发出该值。

据我所知,事件(在Ionic中)用于订阅和广播全局事件。 BehaviorSubject可以是任何范围,通常不是全局范围。

我会说主题是与事件的更接近的比较。主题可以有一个推送到它的值(如事件已发布),它也可以像事件一样订阅。

尽管如此,主题通常不受任何范围的约束。也就是说,它并非旨在始终在应用程序的全局范围内使用。