js 接口请求失败重复请求

本文介绍了一种简单的API请求失败后的重试机制实现方法。通过定义一个retry函数,使用while循环结合try...catch结构来控制重试次数。若请求成功则返回结果,若失败并在规定的重试次数内,则继续尝试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

api接口请求失败重复请求

前端开发中可能遇到的一个情况,要求一个api接口请求失败后重复再调用,并且规定调用的次数。

下面是重复请求的函数,返回一个promise。主要思路:使用while循环,内部使用try catch。 当请求失败时,times 值不为0就重新开始循环,请求成功就结束循环。


/*
    fn: promise
    params: fn的参数
    times: 需要重复发起请求的次数
*/
const retry = (fn, params: object, times: number) => {
  return new Promise(async (resolve, reject) => {
    while (times--) {
      try {
        const res = await fn(params);
        resolve(res);
        break;
      } catch (error) {
        if (times <= 0) {
          reject(error);
        }
      }
    }
  });
};

具体使用


// 业务接口
const getData = params => {
    return axios.get('xxxx/xxxx', {params: params})
}

// 成功就返回数据,失败就重复请求,超过3次失败就返回失败
retry(getData, params, 3)
.then(res => {})
.catch(err => {})

如上,简单的一个失败重复请求就完成了。

### Vue3 中 Axios 封装请求接口失败解决方案 在 Vue3 项目中,封装 Axios 是一种常见的做法,它能够提升代码的复用性和可维护性。然而,在实际开发过程中可能会遇到一些问题,比如跨域错误、重复请求冲突或者配置不当等问题。 以下是针对 Vue3 中封装 Axios 请求接口失败的一些常见原因及其解决方案: #### 1. 跨域问题 如果服务器未设置允许跨域访问,则浏览器会阻止前端发送的请求并抛出 CORS 错误。可以通过以下方式解决: - **服务端配置**:确保后端支持跨域资源共享 (CORS),通常通过设置 HTTP 响应头 `Access-Control-Allow-Origin` 来实现[^1]。 - **代理配置**:在本地开发环境中使用 Webpack 或 Vite 的代理功能来转发请求到目标地址。例如,在 Vite 配置文件中添加如下内容: ```javascript export default { server: { proxy: { '/api': 'http://localhost:8000', }, }, }; ``` #### 2. 请求拦截器中的取消逻辑 当多个相同的请求被触发时,可能导致数据混乱或性能下降。为了防止这种情况发生,可以在请求拦截器中加入取消机制。具体实现方法已在引用[2]中有描述[^2]。下面是一个改进版的例子: ```javascript import axios from 'axios'; class CancelRequest { constructor() { this.pending = {}; } addPending(config) { const url = config.url; if (url && !this.pending[url]) { this.pending[url] = true; } } removePending(config) { const url = config.url; if (url) delete this.pending[url]; } clearAllPending() { this.pending = {}; } } const cancelTokenManager = new CancelRequest(); const instance = axios.create({ baseURL: process.env.VUE_APP_BASE_API, }); instance.interceptors.request.use((config) => { cancelTokenManager.addPending(config); config.cancelToken = new axios.CancelToken((cancel) => { config._cancel = () => { cancel('Duplicate request'); }; }); return config; }, (error) => Promise.reject(error)); instance.interceptors.response.use( (response) => response.data, (error) => { if (axios.isCancel(error)) { console.warn('Request canceled:', error.message); } else { return Promise.reject(error); } } ); export default instance; ``` #### 3. 接口路径拼接不正确 有时由于基础 URL 设置有误或动态参数传递异常,也会导致请求失败。例如,引用[3]提到的一个场景是接口返回的数据包含了完整的绝对路径而非相对路径[^3]。此时需注意调整 API 地址定义规则以及环境变量管理策略。 最后附上一段简单的 Vue3 组件调用封装后的 Axios 实例示范代码片段供参考: ```typescript <template> <div>{{ result }}</div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; import apiClient from '@/utils/api-client'; // 自己创建好的 axios 实例模块 export default defineComponent({ setup() { const result = ref<string>(''); async function fetchData() { try { const res = await apiClient.get('/example-endpoint'); // 替换成实际使用的 endpoint result.value = JSON.stringify(res); } catch (err) { console.error(err); } } fetchData(); return { result }; }, }); </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值