前端配置接口超时时间的方法介绍:
- 使用Axios
- 使用Fetch API
- 使用XMLHTTPRequest
一、使用Axios设置接口超时(推荐)
Axios是前端最常用的HTTP客户端,支持直接在请求配置或全局配置中设置超时时间,适用于大多数前端项目(如Vue、React)。
1. 全局默认超时配置
在项目的Axios实例配置文件(如src/utils/request.js
)中,通过timeout
属性设置全局默认超时时间(单位:毫秒)。所有通过该实例发起的请求都会继承此超时设置,适用于常规接口(如查询、提交表单)。
arduino
import axios from 'axios';
// 创建Axios实例
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // 接口基础路径
timeout: 10000 // 默认超时10秒(可根据业务调整)
});
export default service;
2. 单个接口单独设置超时
若某些接口需要更长或更短的超时时间(如下载文件、调用第三方慢接口),可在具体接口请求中覆盖全局配置,通过timeout
参数指定该接口的超时时间。
php
// 示例:验证码接口(需要快速响应,设为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
拦截器,可统一处理超时报错,提升用户体验(如提示"请求超时,请重试")。
go
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函数
javascript
/**
* 带超时的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函数
javascript
/**
* 带超时的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"功能)测试超时逻辑是否生效。