我编写了一个类,它应该表示一个包含状态的存储。
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);
});
我在这里忘记了什么?或者有没有更好的方法来实现依赖于状态的副作用?
1条答案
按热度按时间4uqofj5v1#
你将看到这旧的值因为
BehaviorSubject
发射这初始值尽快当你subscribe.你可能想要使用这ReplaySubject(1)
代替或增加一个.pipe(skip(1))
避免这问题