RXJS:订阅共享操作符导致奇怪的行为

时间:2019-06-23 08:10:11

标签: rxjs rxjs6

使用以下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看起来是“之前”

我相信守则会说明并使其更加清晰。

如何维护事件的正确顺序,以便最新更新出现在订阅中?

1 个答案:

答案 0 :(得分:0)

目前,解决此问题的非理想方法是将超时中的下一个语句包装在订阅中。如果有人有更好的解决方案,请发布。

StoreUpdates$.pipe(
  distinctUntilChanged((p, n) => {
    return p.b === n.b;
  })
).subscribe(store => {
  setTimeout(() => {
    Store$.next({ c: Math.random() });
  },0)
});