在订阅事件发射方面,Ionic 3中的Events和Angular“Rxjs”中的BehaviorSubject有什么区别,例如,“当某些事件发生时,全局发出它”?
要了解BehaviorSubject,需要花时间来消化Subjects的工作方式以及它们与普通Observable的区别。
Per Ben Lesh (a major contributor on Rxjs):“主体和观察者之间更重要的区别是主体有状态,它保留了一个观察者列表。”
因此,主体保留状态。为了进一步阅读,我鼓励你到read the distinction between "Hot" observables and "Cold" observables。
BehaviorSubject与Subject的不同之处在于,订阅它的任何使用者都将具有立即向其发出的BehaviorSubject的最新值。
所以,假设我们有一个应用程序,它有一个BehaviorSubject,可以发出当前用户的用户名。假设我们的HomePage组件订阅了此BehaviorSubject。一旦初始化该订阅(在HomePage中),将向其发出用户名值。时间流逝并且仍然是同一个用户登录。现在只说AspectPage已经订阅了这个相同的BehaviorSubject。在此期间,用户名未更改,但无论何时初始化此新订阅,都将发出该值。
据我所知,事件(在Ionic中)用于订阅和广播全局事件。 BehaviorSubject可以是任何范围,通常不是全局范围。
我会说主题是与事件的更接近的比较。主题可以有一个推送到它的值(如事件已发布),它也可以像事件一样订阅。
尽管如此,主题通常不受任何范围的约束。也就是说,它并非旨在始终在应用程序的全局范围内使用。
之间存在一些差异,但有3个我认为值得关注。
因此,如果您创建一个新的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()
方法时触发。
由于您需要在组件中创建它的新实例并订阅它,它只能在此组件中工作。使用事件,您始终可以从任何组件订阅和发布,因为发布时的第一个参数和事件是标识符,您发布时将触发对此标识符的任何订阅。
您可以随时使用主题的getValue()
方法获取传递给它的最后一个值。使用事件是不可能的,但您可以创建变量,每次发布事件时,此变量都将保存传递的值。
希望这可以帮助。