Я реализовал это простое хранилище:
export class BookStore extends Store<BookState> implements OnDestroy {
private _sub = new Subscription();
constructor(private api: BookApiService, private data: DataTableService) {
super(new BookState());
this._sub.add(this.data.state.subscribe(val => {
this.fetchBooks(val);
}));
}
fetchBooks(body: any): void {
this._sub.add(this.api.getBooks(body).subscribe(val => {
this.setState({
...this.state,
books: val.Data,
});
}));
}
ngOnDestroy(): void {
this._sub.unsubscribe();
}
}
class BookState extends BaseState {
books: Book[];
}
В конструкторе этого хранилища я подписываюсь на наблюдаемый фильтр данных (объект с различными фильтрами DTO, который изменяется в зависимости от нажатия кнопки пользователем).Проблема в том, что в этом случае возникают гоночные условия.Если я быстро нажимаю на 2 разные кнопки фильтра, иногда данные перезаписываются данными, возвращенными после первого нажатия кнопки (должно быть со второго).
Вот метод getBooks из службы API:
getBooks(body): Observable<BaseResource<T>> {
return this.httpClient
.post<BaseResource<T>>(`${this._host}/${this.base}/${this.name}/getBooks`, body);
}
Возможно ли сделать эту функцию fetchBooks из конструктора:
this._sub.add(this.data.state.subscribe(val => {
this.fetchBooks(val);
}));
Для синхронного выполнения?Я где-то читал, что оператор switchMap - это путь, но я не могу обернуться вокруг него.Может ли кто-нибудь указать мне правильное направление?