使用以下RxJS工具:BehaviorSubject,Subscribe和Next
请参考以下代码和框,并在控制台上查看图像:https://codesandbox.io/s/fancy-bird-0m81p
您会注意到订阅中的对象“ C”的值是“落后1个流”
请考虑以下代码:
const initialState = { a: 1, b: 2, c: 3 };
const Store$ = new BehaviorSubject(initialState);
const StoreUpdates$ = Store$.pipe(
scan((acc, curr) => {
return Object.assign({}, acc, curr);
}, initialState),
share()
);
export const updateStore = update => {
Store$.next(update);
};
StoreUpdates$.pipe(
distinctUntilChanged((p, n) => {
return p.b === n.b;
})
).subscribe(store => {
Store$.next({ c: Math.random() });
});
StoreUpdates$.subscribe(store => {
console.log("Subscription Check:: Notice issue here", store);
});
当调用updateStore函数时,在console.log中,您会注意到,在预订内的下一个调用中更新的C值出现在第一个迭代中,而较旧的值出现在最后一个迭代中。因此,订阅中的next.call看起来是“之前”
我相信守则会说明并使其更加清晰。
如何维护事件的正确顺序,以便最新更新出现在订阅中?
答案 0 :(得分:0)
目前,解决此问题的非理想方法是将超时中的下一个语句包装在订阅中。如果有人有更好的解决方案,请发布。
StoreUpdates$.pipe(
distinctUntilChanged((p, n) => {
return p.b === n.b;
})
).subscribe(store => {
setTimeout(() => {
Store$.next({ c: Math.random() });
},0)
});