前端配置接口超时时间的三种方法
作者:旺仔小猪
这篇文章主要介绍了前端设置接口超时的三种方法:Axios(全局/单请求配置及拦截器)、FetchAPI(Promise.race结合setTimeout)、XMLHttpRequest(timeout属性),需合理设置、区分错误类型并测试验证,需要的朋友可以参考下
前端配置接口超时时间的方法介绍:
- 使用Axios
- 使用Fetch API
- 使用XMLHTTPRequest
一、使用Axios设置接口超时(推荐)
Axios是前端最常用的HTTP客户端,支持直接在请求配置或全局配置中设置超时时间,适用于大多数前端项目(如Vue、React)。
1. 全局默认超时配置
在项目的Axios实例配置文件(如src/utils/request.js
)中,通过timeout
属性设置全局默认超时时间(单位:毫秒)。所有通过该实例发起的请求都会继承此超时设置,适用于常规接口(如查询、提交表单)。
import axios from 'axios'; // 创建Axios实例 const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 接口基础路径 timeout: 10000 // 默认超时10秒(可根据业务调整) }); export default service;
2. 单个接口单独设置超时
若某些接口需要更长或更短的超时时间(如下载文件、调用第三方慢接口),可在具体接口请求中覆盖全局配置,通过timeout
参数指定该接口的超时时间。
// 示例:验证码接口(需要快速响应,设为5秒) export function getCodeImg() { return request({ url: '/captchaImage', method: 'get', timeout: 5000 // 5秒超时 }); } // 示例:下载导出文件接口(耗时较长,设为30秒) export function handleExport() { return request({ url: '/system/xxxx/export', method: 'post', data: this.queryParams, responseType: 'blob', // 指定响应类型为二进制流(下载接口需设置) timeout: 30000 // 30秒超时 }); }
3. 结合拦截器增强超时处理
通过Axios的interceptors.response
拦截器,可统一处理超时报错,提升用户体验(如提示“请求超时,请重试”)。
service.interceptors.response.use( response => response, // 正常响应直接返回 error => { if (error.code === 'ECONNABORTED') { // Axios定义的超时错误码 console.error('请求超时,请检查网络或联系管理员'); // 可在此处添加重试逻辑或弹窗提示 } else { console.error('请求失败:', error.message); } return Promise.reject(error); } );
二、使用Fetch API设置接口超时
Fetch是现代浏览器的原生HTTP接口,但本身不支持直接设置超时,需通过Promise.race
结合setTimeout
实现。适用于不想引入第三方库的项目。
1. 封装带超时的Fetch函数
/** * 带超时的Fetch请求 * @param {string} url - 接口地址 * @param {Object} options - Fetch配置项(如method、headers) * @param {number} timeout - 超时时间(毫秒,默认5秒) * @returns {Promise} - 返回Fetch响应的Promise */ function fetchWithTimeout(url, options = {}, timeout = 5000) { return Promise.race([ fetch(url, options), // 正常Fetch请求 new Promise((_, reject) => setTimeout(() => reject(new Error('请求超时')), timeout) // 超时Promise ) ]); } // 使用示例 fetchWithTimeout('https://example.com/api', { method: 'GET' }, 8000) .then(response => { if (!response.ok) throw new Error('网络响应异常'); return response.json(); }) .then(data => console.log('接口数据:', data)) .catch(error => console.error('请求错误:', error.message));
三、传统XMLHttpRequest设置超时
XMLHttpRequest是较老的HTTP接口,适用于需要兼容旧浏览器的项目(如IE11)。通过timeout
属性可直接设置超时时间。
1. 封装带超时的XMLHttpRequest函数
/** * 带超时的XMLHttpRequest请求 * @param {string} url - 接口地址 * @param {string} method - 请求方法(GET/POST等) * @param {Object} data - 请求数据(POST时使用) * @param {number} timeout - 超时时间(毫秒,默认5秒) * @returns {Promise} - 返回响应数据的Promise */ function xhrWithTimeout(url, method = 'GET', data = null, timeout = 5000) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.timeout = timeout; // 设置超时时间 xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { resolve(xhr.responseText); // 成功响应 } else { reject(new Error(`请求失败,状态码:${xhr.status}`)); } }; xhr.ontimeout = function() { reject(new Error('请求超时')); // 超时错误 }; xhr.onerror = function() { reject(new Error('网络错误')); // 网络错误 }; if (data) { xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(JSON.stringify(data)); // POST请求发送JSON数据 } else { xhr.send(); // GET请求 } }); } // 使用示例 xhrWithTimeout('https://example.com/api', 'GET', null, 10000) .then(data => console.log('接口数据:', JSON.parse(data))) .catch(error => console.error('请求错误:', error.message));
四、注意事项
合理设置超时时间:
- 全局超时时间需平衡用户体验与服务器压力(如常规接口设为5-10秒);
- 特殊接口(如下载、第三方调用)需根据实际业务调整(如下载设为30秒以上)。
异常处理:
- 超时后需给用户明确的错误提示(如“请求超时,请检查网络”),并可根据业务需求添加重试逻辑(如最多重试2次)。
区分网络错误与超时:
- 网络错误(如
ECONNREFUSED
)与超时错误(ECONNABORTED
)需分开处理,避免误导用户。
测试验证:
- 配置完成后,需通过模拟慢网络(如Chrome开发者工具的“Network Throttling”功能)测试超时逻辑是否生效。
以上就是前端配置接口超时时间的三种方法的详细内容,更多关于前端配置接口超时时间的资料请关注脚本之家其它相关文章!