为什么我的 RxJs 状态更改显示无序?
Why do my RxJs state changes show up out of order?
当一个订阅者修改另一个订阅者的值时,第二个订阅者会乱序处理它的结果。
示例代码:
subject = new Rx.BehaviorSubject()
subject.next({value: 'Test1'})
v1 = subject.pluck('value').distinctUntilChanged()
v2 = subject.pluck('value2').distinctUntilChanged()
h1 = v1.subscribe(function(it) { if (it == 'Test2') subject.next({value: it, value2: true}) })
h2 = v2.subscribe(function(it) { console.log('v2', it) })
subject.next({value: 'Test2'})
预期结果:
v2 undefined
v2 true
实际结果:
v2 undefined
v2 true
v2 undefined
我做错了什么?
从 v5 开始,rxjs 不保证重入(尝试更新订阅中的源值)按顺序工作。这是由于默认情况下可观察源不进行特定调度,因此大多数同步源的订阅同步运行,而其他一些则不会。如果你想通过重入实现特定的执行顺序,你应该为你想要的行为相应地设置 scheduler observable,或者使用 scheduler 创建 observable(静态创建方法通常接受 scheduler)或者使用 observeOn
/ subscribeOn
。
当一个订阅者修改另一个订阅者的值时,第二个订阅者会乱序处理它的结果。
示例代码:
subject = new Rx.BehaviorSubject()
subject.next({value: 'Test1'})
v1 = subject.pluck('value').distinctUntilChanged()
v2 = subject.pluck('value2').distinctUntilChanged()
h1 = v1.subscribe(function(it) { if (it == 'Test2') subject.next({value: it, value2: true}) })
h2 = v2.subscribe(function(it) { console.log('v2', it) })
subject.next({value: 'Test2'})
预期结果:
v2 undefined
v2 true
实际结果:
v2 undefined
v2 true
v2 undefined
我做错了什么?
从 v5 开始,rxjs 不保证重入(尝试更新订阅中的源值)按顺序工作。这是由于默认情况下可观察源不进行特定调度,因此大多数同步源的订阅同步运行,而其他一些则不会。如果你想通过重入实现特定的执行顺序,你应该为你想要的行为相应地设置 scheduler observable,或者使用 scheduler 创建 observable(静态创建方法通常接受 scheduler)或者使用 observeOn
/ subscribeOn
。