Natebash
@Natebash
React, Vue, Angular, Navite JS, Python / Node JS

Отмена axios запроса в redux thunk?

Всем привет, есть запрос через axios на загрузку файла который крутится в redux thunk, который нужно прервать по кнопке Cancel с фронта.

export const uploadDataThunk = (uploadData: IUploadDataRequest) => {
  return async (dispatch: Dispatch<Action>, getState: () => RootState) => {
    try {
      await axiosInst.post(
        `api/${uploadData.id}/upload-data`,
        uploadData.formData,
      );

      dispatch(uploadPhotoAcceptedAC(fileName));
    } catch (e) {
      dispatch(uploadPhotoDeniedAC());
    }
  };
};


Вопрос, как правильно это сделать?
  • Вопрос задан
  • 537 просмотров
Пригласить эксперта
Ответы на вопрос 2
Natebash
@Natebash Автор вопроса
React, Vue, Angular, Navite JS, Python / Node JS
black1277 Да, все верно, у меня немного другая реализация получилась, у нас старый пакет axios который пока не можем поднять по собственным соображениям, поэтому сделал с помощью CancelToken
https://axios-http.com/docs/cancellation

Санка которая запускается на событие download
const CancelToken = axios.CancelToken;
const source = CancelToken.source();

export const uploadThunk = (uploadData) => {
  return async (dispatch: Dispatch<Action>, getState: () => RootState) => {
    try {
      await axiosInst.post(
        `${upload_url}/${subjectId}/upload`,
        uploadData, {cancelToken: source.token}
      );

    } catch (e) {
      console.log("Failed upload", e);
    }
  };
};


Отменяем предыдущий запрос по клику кнопки на фронте
export const cancelUploadThunk = () => {
  return async (dispatch: Dispatch<Action>, getState: () => RootState) => {
    source.cancel("Operation canceled by the user.");
  };
};
Ответ написан
Комментировать
black1277
@black1277
Вольный стрелок
Используйте AbortController для отмены запроса.
Вот здесь на русском https://learn.javascript.ru/fetch-abort рассказано как его применять к fetch (для понимания), а вот тут https://axios-http.com/docs/cancellation как его использовать для axios. Ну и в редаксе добавите нужный action.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы