Вот пример того, что я думаю, вы можете искать.Я не знаком с axios .Я просто вытащил пример отмены с их веб-сайта.
Я также заменил switchMap
на mergeMap
, потому что я думаю, что если
..
filter(isActionOf(actions.getApplicationNotes)),
map(action => action.payload),
..
произойдет другое действие, то оно отменитподписка на предыдущую наблюдаемую информацию, возвращаемую switchMap без необходимости отмены вызова на axios.get
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
const loadApplicationNotesEpic: Epic<Action, Action, RootState> = action$ =>
action$.pipe(
filter(isActionOf(actions.getApplicationNotes)),
map(action => action.payload),
mergeMap(applicationId => {
// create cancel token here?:
// const cancelToken = axios.CancelToken;
// where to use cancelToken?
const promise$ = from(
axios.get(
apiUrl(`/${applicationId}/notes`, { cancelToken: source.token })
)
).pipe(
catchError(error => {
console.error(error);
return of(actions.getApplicationNotesError(error));
})
);
const cancelled$ = filterAction(
action$,
actions.getApplicationNotesCancel
).pipe(mapTo("cancelled"));
return race(promise$, cancelled$).pipe(
mergeMap(winner => {
if (winner === "cancelled") {
return of(EMPTY).pipe(
tap(() => source.cancel('Operation canceled by the user.')),
ignoreElements())
}
return of(winner).pipe(
map(notes =>
actions.getApplicationNotesSuccess(notes, applicationId)
)
);
})
);
})
);