前端配置接口超時時間的三種方法
前端配置接口超時時間的方法介紹:
- 使用Axios
- 使用Fetch API
- 使用XMLHTTPRequest
一、使用Axios設(shè)置接口超時(推薦)
Axios是前端最常用的HTTP客戶端,支持直接在請求配置或全局配置中設(shè)置超時時間,適用于大多數(shù)前端項目(如Vue、React)。
1. 全局默認超時配置
在項目的Axios實例配置文件(如src/utils/request.js)中,通過timeout屬性設(shè)置全局默認超時時間(單位:毫秒)。所有通過該實例發(fā)起的請求都會繼承此超時設(shè)置,適用于常規(guī)接口(如查詢、提交表單)。
import axios from 'axios';
// 創(chuàng)建Axios實例
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // 接口基礎(chǔ)路徑
timeout: 10000 // 默認超時10秒(可根據(jù)業(yè)務(wù)調(diào)整)
});
export default service;
2. 單個接口單獨設(shè)置超時
若某些接口需要更長或更短的超時時間(如下載文件、調(diào)用第三方慢接口),可在具體接口請求中覆蓋全局配置,通過timeout參數(shù)指定該接口的超時時間。
// 示例:驗證碼接口(需要快速響應(yīng),設(shè)為5秒)
export function getCodeImg() {
return request({
url: '/captchaImage',
method: 'get',
timeout: 5000 // 5秒超時
});
}
// 示例:下載導(dǎo)出文件接口(耗時較長,設(shè)為30秒)
export function handleExport() {
return request({
url: '/system/xxxx/export',
method: 'post',
data: this.queryParams,
responseType: 'blob', // 指定響應(yīng)類型為二進制流(下載接口需設(shè)置)
timeout: 30000 // 30秒超時
});
}
3. 結(jié)合攔截器增強超時處理
通過Axios的interceptors.response攔截器,可統(tǒng)一處理超時報錯,提升用戶體驗(如提示“請求超時,請重試”)。
service.interceptors.response.use(
response => response, // 正常響應(yīng)直接返回
error => {
if (error.code === 'ECONNABORTED') { // Axios定義的超時錯誤碼
console.error('請求超時,請檢查網(wǎng)絡(luò)或聯(lián)系管理員');
// 可在此處添加重試邏輯或彈窗提示
} else {
console.error('請求失?。?, error.message);
}
return Promise.reject(error);
}
);
二、使用Fetch API設(shè)置接口超時
Fetch是現(xiàn)代瀏覽器的原生HTTP接口,但本身不支持直接設(shè)置超時,需通過Promise.race結(jié)合setTimeout實現(xiàn)。適用于不想引入第三方庫的項目。
1. 封裝帶超時的Fetch函數(shù)
/**
* 帶超時的Fetch請求
* @param {string} url - 接口地址
* @param {Object} options - Fetch配置項(如method、headers)
* @param {number} timeout - 超時時間(毫秒,默認5秒)
* @returns {Promise} - 返回Fetch響應(yīng)的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('網(wǎng)絡(luò)響應(yīng)異常');
return response.json();
})
.then(data => console.log('接口數(shù)據(jù):', data))
.catch(error => console.error('請求錯誤:', error.message));
三、傳統(tǒng)XMLHttpRequest設(shè)置超時
XMLHttpRequest是較老的HTTP接口,適用于需要兼容舊瀏覽器的項目(如IE11)。通過timeout屬性可直接設(shè)置超時時間。
1. 封裝帶超時的XMLHttpRequest函數(shù)
/**
* 帶超時的XMLHttpRequest請求
* @param {string} url - 接口地址
* @param {string} method - 請求方法(GET/POST等)
* @param {Object} data - 請求數(shù)據(jù)(POST時使用)
* @param {number} timeout - 超時時間(毫秒,默認5秒)
* @returns {Promise} - 返回響應(yīng)數(shù)據(jù)的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; // 設(shè)置超時時間
xhr.onload = function() {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.responseText); // 成功響應(yīng)
} else {
reject(new Error(`請求失敗,狀態(tài)碼:${xhr.status}`));
}
};
xhr.ontimeout = function() {
reject(new Error('請求超時')); // 超時錯誤
};
xhr.onerror = function() {
reject(new Error('網(wǎng)絡(luò)錯誤')); // 網(wǎng)絡(luò)錯誤
};
if (data) {
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify(data)); // POST請求發(fā)送JSON數(shù)據(jù)
} else {
xhr.send(); // GET請求
}
});
}
// 使用示例
xhrWithTimeout('https://example.com/api', 'GET', null, 10000)
.then(data => console.log('接口數(shù)據(jù):', JSON.parse(data)))
.catch(error => console.error('請求錯誤:', error.message));
四、注意事項
??合理設(shè)置超時時間??:
- 全局超時時間需平衡用戶體驗與服務(wù)器壓力(如常規(guī)接口設(shè)為5-10秒);
- 特殊接口(如下載、第三方調(diào)用)需根據(jù)實際業(yè)務(wù)調(diào)整(如下載設(shè)為30秒以上)。
??異常處理??:
- 超時后需給用戶明確的錯誤提示(如“請求超時,請檢查網(wǎng)絡(luò)”),并可根據(jù)業(yè)務(wù)需求添加重試邏輯(如最多重試2次)。
??區(qū)分網(wǎng)絡(luò)錯誤與超時??:
- 網(wǎng)絡(luò)錯誤(如
ECONNREFUSED)與超時錯誤(ECONNABORTED)需分開處理,避免誤導(dǎo)用戶。
??測試驗證??:
- 配置完成后,需通過模擬慢網(wǎng)絡(luò)(如Chrome開發(fā)者工具的“Network Throttling”功能)測試超時邏輯是否生效。
以上就是前端配置接口超時時間的三種方法的詳細內(nèi)容,更多關(guān)于前端配置接口超時時間的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
js實現(xiàn)翻頁后保持checkbox選中狀態(tài)的實現(xiàn)方法
在項目中有需求如下:上下分頁后,選中的checkbox狀態(tài)保持不變2012-11-11
Javascript的動態(tài)增加類的實現(xiàn)方法
下面小編就為大家?guī)硪黄狫avascript的動態(tài)增加類的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10
js基于面向?qū)ο髮崿F(xiàn)網(wǎng)頁TAB選項卡菜單效果代碼
這篇文章主要介紹了js基于面向?qū)ο髮崿F(xiàn)網(wǎng)頁TAB選項卡菜單效果代碼,實例演示了鼠標(biāo)滑過即點擊兩種方式實現(xiàn)tab選項卡切換功能,涉及JavaScript鼠標(biāo)事件控制頁面元素屬性變換的功能,需要的朋友可以參考下2015-09-09
js中關(guān)于String對象的replace使用詳解
關(guān)于String對象的replace使用詳解,需要的朋友可以參考下。2011-05-05
JavaScript正則表達式exec/g實現(xiàn)多次循環(huán)用法示例
這篇文章主要介紹了JavaScript正則表達式exec/g實現(xiàn)多次循環(huán)用法,結(jié)合實例形式分析了javascript正則表達式g修飾符相關(guān)使用技巧,需要的朋友可以參考下2017-01-01
Bootstrap開發(fā)實戰(zhàn)之第一次接觸Bootstrap
Bootstrap開發(fā)實戰(zhàn)之第一次接觸Bootstrap,想要學(xué)好一門語言,首先應(yīng)該進行深入了解,感興趣的小伙伴們可以參考一下2016-06-06
Bootstrap的popover(彈出框)在append后彈不出(失效)
這篇文章主要介紹了Bootstrap的popover(彈出框)在append后彈不出,失效的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
JavaScript中表格文件導(dǎo)出的實現(xiàn)示例
本文主要介紹了JavaScript中表格文件導(dǎo)出的實現(xiàn)示例,JavaScript中的Blob對象和a標(biāo)簽的download屬性是實現(xiàn)這一功能的關(guān)鍵,本文就來詳細的介紹一下,感興趣的可以了解一下2024-01-01

