【发布时间】:2018-03-05 17:18:07
【问题描述】:
假设 RxJS 会按照每个观察者订阅的顺序触发下一个函数是否安全?我有一个具有 BehaviorSubject 公共属性的类。对其进行的第一次订阅将来自类的构造函数中的 with。我想确保此私人订阅的下一个在任何其他订阅之前有效。
【问题讨论】:
标签: javascript rxjs behaviorsubject
假设 RxJS 会按照每个观察者订阅的顺序触发下一个函数是否安全?我有一个具有 BehaviorSubject 公共属性的类。对其进行的第一次订阅将来自类的构造函数中的 with。我想确保此私人订阅的下一个在任何其他订阅之前有效。
【问题讨论】:
标签: javascript rxjs behaviorsubject
实际上,是的,这是安全的; Subject 类(BehaviorSubject 继承自该类)的实现总是按照订阅的顺序处理订阅。虽然我没有看到 rxjs 团队保证永远都是这种情况,但我想改变它会破坏很多代码(包括我的)。
严格来说,不,不保证订阅处理顺序。这可以追溯到 .NET 下的 Rx,当时团队试图将订阅行为与多播委托的行为保持一致(您可以在 https://social.msdn.microsoft.com/Forums/en-US/ac721f91-4dbc-40b8-a2b2-19f00998239f/order-of-subscriptions-order-of-observations?forum=rx 上从 Bart De Smet 找到一个很好的解释)。
在“订阅顺序流程”不适合我之前,我遇到过各种场景,我需要直接控制。在这种情况下,我使用了一个简单的函数将一个 observable 变成两个,其中一个保证在另一个之前得到通知。您可以使用类似的方法来避免假设订阅将始终按顺序处理,尽管我个人认为没有必要。有兴趣的可以在这里查看详情:RxJs: Drag and Drop example : add mousedragstart
【讨论】:
就behaviorSubject 和一般的主题而言,它们是产生和消耗值的“热门”可观察对象。你可以假设只要没有调用observer.complete() 方法,下一个函数就会一直触发。
您拥有的第一个订阅将设置并初始化状态(此处为假设),因此每个后续订阅者都将能够连接到该订阅并确定 next(value) 排放量。
希望这会有所帮助。
【讨论】: