redux 可观察到的副作用未按预期工作,发出旧值

mftmpeh8  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(104)

我编写了一个类,它应该表示一个包含状态的存储。

public state$: Observable<T>;
private _state$: BehaviorSubject<T>;

protected constructor(initialState: T) {
  this._state$ = new BehaviorSubject(initialState);
  this.state$ = this._state$.asObservable();
}

 ...
public select<K extends keyof T>(key: K): Observable<T[K]> {
  return this.state$.pipe(distinctUntilKeyChanged(key), pluck(key));
}

问题是,如果我选择状态,它将记录两次。第一次是新值,在旧值之后。

this.jobStore.select('status').subscribe((status) => console.log(status))

1 log: true

2 log: false

在其他地方我必须这样做,这将修改我的状态:

this.jobStore.select('jobs')
    .subscribe((jobs) => {
      this.jobStore.setState('status', someNewCalculatedValueBasedOnJobs);
    });

如果我设置了一个超时,我就不会遇到这个问题,“status”只会发出一次

this.jobStore.select('jobs')
    .subscribe((jobs) => {
      setTimeout(() => {
        this.jobStore.setState('status', someNewCalculatedValue);
      }, 100);
    });

我在这里忘记了什么?或者有没有更好的方法来实现依赖于状态的副作用?

4uqofj5v

4uqofj5v1#

你将看到这旧的值因为BehaviorSubject发射这初始值尽快当你subscribe.你可能想要使用这ReplaySubject(1)代替或增加一个.pipe(skip(1))避免这问题

相关问题