Ваш эффект должен выбрать, находится ли запрашиваемые данные уже в хранилище, и только если это не так, он должен инициировать запрос AJAX для их извлечения.И в обоих случаях, когда данные готовы, отправьте действие «готовность данных».
Вот как я делал это в прошлом:
export class MyEffects {
constructor(private store$: Store<fromStore.AppState>,
private action$: Actions,
private backend: MyService,
) { }
@Effect()
fetchData$ = this.action$.ofType<fromActions.FetchDataAction>(fromActions.FETCHDATA).pipe(
withLatestFrom(this.store$.select(x => x.main.cacheMap)),
switchMap(([action, cacheMap]) => this.fetchData(action.id, cacheMap)),
map(r => r new fromActions.DataReadyAction(r)),
);
fetchData(id: string, cacheMap: { [key: string]: Item }): Observable<Item> {
if (!cacheMap[id]) {
return this.backend.getData(id);
} else {
return of({ ...cacheMap[id] });
}
}
}
Обратите внимание на несколько вещей:
- В конструктор класса эффектов вставлено хранилище.
- Сам эффект использует
withLatestFrom
для получения последней копии состояния. - Функция
fetchData
выбирает функциюотправлять ли запрос AJAX или немедленно возвращаться на основе наличия запрошенного ключа в переменной cacheMap
, которая является частью хранилища.
Когда действие DataReady
сокращено, новоеэлемент помещается в кеш-карту состояния, чтобы последующие действия FetchData
не запрашивали его повторно.