最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端配置接口超時時間的三種方法

 更新時間:2025年09月03日 08:38:06   作者:旺仔小豬  
這篇文章主要介紹了前端設(shè)置接口超時的三種方法:Axios(全局/單請求配置及攔截器)、FetchAPI(Promise.race結(jié)合setTimeout)、XMLHttpRequest(timeout屬性),需合理設(shè)置、區(qū)分錯誤類型并測試驗證,需要的朋友可以參考下

前端配置接口超時時間的方法介紹:

  • 使用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)文章

最新評論

韶山市| 文登市| 方山县| 曲麻莱县| 麦盖提县| 宁晋县| 南投县| 靖西县| 九寨沟县| 福州市| 宝清县| 吉林省| 察隅县| 轮台县| 象山县| 肇东市| 德清县| 古浪县| 桃园市| 饶阳县| 襄垣县| 民乐县| 吉木萨尔县| 旺苍县| 出国| 阳城县| 铜陵市| 民和| 炎陵县| 莱西市| 信丰县| 齐齐哈尔市| 苗栗县| 民丰县| 诸城市| 汉中市| 峨眉山市| 正安县| 阿瓦提县| 开平市| 江门市|