取消所有挂起的axios请求错误

bfnvny8b  于 2023-08-04  发布在  iOS
关注(0)|答案(1)|浏览(152)

我目前正在使用Axios的Vue 3应用程序。基本上,我的用例是我有一个全局加载指示器,它使用请求拦截器激活,然后在响应拦截器中停用。这对于只有一个API请求的页面非常有效。当我们有并发请求时,这将成为并发出。
我一直在搜索S.O.我似乎找不到好的解决办法我知道你可以使用AbortController取消请求,但是axios文档对此并不太详细。我https://github.com/axios/axios#abortcontroller想发生的是,如果我以前的请求返回一个异常,我想取消剩余的挂起调用.
我也想知道这是否可以通过某种队列系统来实现?我似乎找不到任何解决这个问题的最佳实践。
蒂亚!
axiosClient.ts

// we first import the axios library
import { notify } from '@/services/notificationService';
import axios, { AxiosError } from 'axios';
import { storeToRefs } from 'pinia';
import { EnvironmentEnum } from './interfaces/environment-enum';
import { useConfigStore } from '@/stores/configuration-store';
import axiosRetry from 'axios-retry';

const axiosClient = axios.create({
    withCredentials: true,
});

axiosRetry(axios, {
    retries: 3,
    retryDelay: () => {
        return 1000;
    },
});

/** Adding the response interceptors */
axiosClient.interceptors.request.use((config) => {
    const store = useConfigStore();
    const { isLoading } = storeToRefs(useConfigStore());
    const { selectedEnvironment } = storeToRefs(store);
    config.baseURL = `${EnvironmentEnum[selectedEnvironment.value]}/`;
    isLoading.value = true;
    return config;
});

axiosClient.interceptors.response.use(
    (response) => {
        const { isLoading } = storeToRefs(useConfigStore());
        isLoading.value = false;
        return Promise.resolve(response);
    },
    (error: AxiosError) => {
        const { isLoading } = storeToRefs(useConfigStore());
        isLoading.value = false;
        notify(error.code === 'ERR_NETWORK' ? error.message : `${JSON.stringify(error.response?.data)}`, 'danger');
    }
);

export default axiosClient;

字符串
组件

const search = () => {
    const data = ref();
    let result = await call1();
    if(result && result.status == 200)
    data.value = await call2();
};

edqdpe6u

edqdpe6u1#

来自Axios.CancelToken
通过API调用传递cancelToken,如果任何调用被取消,所有挂起的请求将通过调用source.cancel停止

import { ref } from 'vue';
import axios from 'axios';

export default {
  setup() {
    const cancelToken = axios.CancelToken;
    const source = cancelToken.source();
    const errorRef = ref(null);

    const makeRequests = async () => {
      try {
        await axios.get('/api/endpoint1', { cancelToken: source.token });
        await axios.get('/api/endpoint2', { cancelToken: source.token });
      } catch (error) {
       
          console.error('Error occurred:', error);
          errorRef.value = error;
          source.cancel('Request canceled due to an error');
        }
    };

    makeRequests();

    return {
      error: errorRef,
    };
  },
};

字符串

相关问题