国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue2/3 axios 請求重試、取消請求、loading 串行并行等(分享)

這篇具有很好參考價值的文章主要介紹了vue2/3 axios 請求重試、取消請求、loading 串行并行等(分享)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

基礎版,添加 loading

在請求響應攔截器里面添加 loading,這樣就不需要給每一個請求添加 loading 了
這些代碼都是 vue2 項目的,vue3 也通用,改一下 loading 和 message 就好了(主要是 element 的區(qū)別)
我這里最后沒有合并代碼,有的配置不適合寫在一起,看自己項目的需要

import axios from 'axios';
import { Loading, Message } from 'element-ui';

const instance = axios.create({
  baseURL: 'http://localhost:5500',
  timeout: 30000,
});

let loadingInstance = null;
// 添加請求攔截器
instance.interceptors.request.use(
  (config) => {
    loadingInstance = Loading.service({
      fullscreen: true,
      text: '加載中...',
      background: "black",
    });
    return config;
  },
  // 斷網(wǎng)走這里
  (error) => {
    Message.error('請求錯誤:' + error.message);
    return Promise.reject(error);
  },
);

// 添加響應攔截器
instance.interceptors.response.use(
  ({ data }) => {
    loadingInstance.close();
    return data;
  },
  // !== 2xx 走這里
  (error) => {
    loadingInstance.close();
    return Promise.reject(error.response);
  },
);

export default instance

響應狀態(tài)碼配置

響應狀態(tài)碼配置,更好的給用戶提示,這里只設計到響應,就只寫了響應攔截

// 根據(jù)規(guī)范添加配置
const statusOption = [
  {
    code: "200",
    state: "success",
    description: "請求(或處理)成功",
  },
  {
    code: "400",
    state: "ParameterError",
    description: "請求參數(shù)不完整或不正確",
  },
  {
    code: "401",
    state: "Unauthorized",
    description: "訪問請求未授權! 當前 SESSION 失效, 請重新登陸",
  },
  {
    code: "403",
    state: "Forbidden",
    description: "您無權進行此操作,請求執(zhí)行已拒絕",
  },
  {
    code: "404",
    state: "NotFound",
    description: "找不到與請求匹配的 HTTP 資源",
  },
  {
    code: "405",
    state: "HttpMehtodError",
    description: "HTTP請求類型不合法",
  },
  {
    code: "406",
    state: "HttpRequestError",
    description: "HTTP請求不合法,請求參數(shù)可能被篡改",
  },
  {
    code: "407",
    state: "URLExpireError",
    description: "該URL已經(jīng)失效",
  },
  {
    code: "500",
    state: "Error",
    description: "內部請求出錯",
  },
];

// 添加響應攔截器
instance.interceptors.response.use(
  ({ data }) => {
    loadingInstance.close();
    // 這里是請求成功的內部狀態(tài)碼
    // 這個要和后端約定,我這里就默認除了 200 都有問題
    // 這樣就不用在請求接口出錯的時候一個個 message 了
    if (data.status !== 200) {
      Message.error(data.message);
      return Promise.reject(data);
    }
    return Promise.resolve(data);
  },
  (error) => {
    let status = error.response.status;
    if (status < 400) {
      Message.warning(error.response.statusText);
    } else {
      let err = statusOption.find((item) => item.code == status);
      Message.error(err ? err.description : "響應出錯請聯(lián)系管理員!");
    }
    loadingInstance.close();
    return Promise.reject(error.response);
  }
);

loading 串行、并行

串行 loading 閃屏、并行 loading 提前關閉

  • 串行的情況是請求之間的依賴,請求 A 完成后立即開始請求 B,這樣會導致 loading 閃屏
  • 并行是兩個請求同時請求,請求 A 的時間為 5s,請求 B 的時間為 3s,因為 loading 都是同一個實例,會導致請求 B 時提前關閉 loading,關閉兩秒后又請求到了新的數(shù)據(jù)
import axios from "axios";
import { Loading, Message } from 'element-ui';

const instance = axios.create({
  baseURL: "http://localhost:5500",
  timeout: 30000,
});

// 處理并行
let loadingCount = 0;

// 處理串行
let loadingTimer = null;

function loadingClose() {
  loadingCount--;
  if (!loadingCount) {
    // 延遲等待是否還有下一個請求
    loadingTimer = setTimeout(() => {
      loadingInstance.close();
      loadingTimer = null;
    }, 300);
  }
}

function loadingOpen() {
  loadingCount++;
  // 如果有請求需要清除關閉
  if (loadingTimer) {
    clearTimeout(loadingTimer);
    loadingTimer = null;
  }
  loadingInstance = Loading.service({
    fullscreen: true,
    text: "加載中...",
    background: "black",
  });
}

let loadingInstance = null;
// 添加請求攔截器
instance.interceptors.request.use(
  (config) => {
    loadingOpen();
    return config;
  },
  (error) => {
    Message.error("請求錯誤:" + error.message);
    return Promise.reject(error);
  }
);

// 添加響應攔截器
instance.interceptors.response.use(
  ({ data }) => {
    loadingClose();
    return data;
  },
  (error) => {
    loadingClose();
    return Promise.reject(error.response);
  }
);

export default instance;

請求掛起

延遲請求發(fā)送
我這里的應用場景是 token,當我發(fā)現(xiàn)當前請求沒有 token 時,先掛起當前請求然后獲取 token,在添加上

import axios from "axios";
import { Loading, Message } from 'element-ui';

const instance = axios.create({
  baseURL: "http://localhost:5500",
  timeout: 30000,
});

// 獲取 token 的方法,這里的請求不能使用封裝的,不然請求一直沒有 token 就會一直掛起
async function passParamsGetToken() {}

let loadingInstance = null;
// 添加請求攔截器
instance.interceptors.request.use(
  // 這種用 async/await 也可以,更易讀一些,原理都是等待請求的發(fā)送
  (config) => {
    if (!config.headers.Authorization) {
      // 請求掛起
      return new Promise(async (resolve, reject) => {
        let token = await passParamsGetToken();
        // 為當前請求添加 token
        config.headers.Authorization = token;
        // 為實例添加 token,這樣下一個請求也會存在token
        instance.defaults.headers.common["Authorization"] = token;

        loadingInstance = Loading.service({
          fullscreen: true,
          text: "加載中...",
          background: "black",
        });
        resolve(config);
      });
    } else {
      loadingInstance = Loading.service({
        fullscreen: true,
        text: "加載中...",
        background: "black",
      });
      return config;
    }
  },
  (error) => {
    Message.error("請求錯誤:" + error.message);
    return Promise.reject(error);
  }
);

// 添加響應攔截器
instance.interceptors.response.use(
  ({ data }) => {
    loadingInstance.close();
    return data;
  },
  (error) => {
    loadingInstance.close();
    return Promise.reject(error.response);
  }
);

export default instance;

取消請求

重復請求需要取消,取消請求會走響應攔截器的 error,會和請求重試有沖突

  • 取消請求不是真正意義上的取消,請求已經(jīng)發(fā)送,后端接收到了,只是前端不在響應了
  • 使用表單類的操作,取消請求沒用,頂多是獲取列表的時候,前端少處理一次操作
import axios from "axios";
import { Loading, Message } from 'element-ui';

const requestMap = new Map();

function setRequestMap(config) {
  requestMap.set(JSON.stringify(config), config);
}

function deleteRequestMap(config) {
  let xLConfig = JSON.stringify(config);
  let hasConfig = null;
  if ((hasConfig = requestMap.get(xLConfig))) {
    // 請求完成后在取消,不影響
    hasConfig.controller.abort();
    requestMap.delete(xLConfig);
  }
}

// 設置控制器,需要先設置控制器,這樣添加刪除后的序列化字符才可以匹配
function setAbortController(config) {
  const controller = new AbortController();
  config.controller = controller;
  config.signal = controller.signal;
}

const instance = axios.create({
  baseURL: "http://localhost:5500",
  timeout: 30000,
});

let loadingInstance = null;
// 添加請求攔截器
instance.interceptors.request.use(
  (config) => {
    setAbortController(config);
    deleteRequestMap(config);
    setRequestMap(config);

    loadingInstance = Loading.service({
      fullscreen: true,
      text: "加載中...",
      background: "black",
    });
    return config;
  },
  (error) => {
    Message.error("請求錯誤:" + error.message);
    return Promise.reject(error);
  }
);

// 添加響應攔截器
instance.interceptors.response.use(
  (response) => {
    deleteRequestMap(response.config);
    loadingInstance.close();
    return response.data;
  },
  (error) => {
    // 重復請求的取消,表示后面肯定有請求,則不需要關閉 loading
    if (axios.isCancel(error)) {
      // console.log("Request canceled", 123123);
      // 其他異常的處理
    } else {
      deleteRequestMap(error.config);
      loadingInstance.close();
    }
    return Promise.reject(error.response);
  }
);

export default instance;

請求重試

請求失敗需要重試文章來源地址http://www.zghlxwxcb.cn/news/detail-496976.html

// utils/reuqest.js 中
import axios from "axios";
import { Loading, Message } from 'element-ui';

const instance = axios.create({
  baseURL: "http://localhost:5500",
  timeout: 30000,
  retry: 3, // 最大重試次數(shù)為 3
  retryDelay: 1000, // 重試時的延遲時間為 1 秒
});

let loadingInstance = null;
// 添加請求攔截器
instance.interceptors.request.use(
  (config) => {
    loadingInstance = Loading.service({
      fullscreen: true,
      text: config.retryCount ? "請求重試中..." : "加載中...", // 重試后改變 text 顯示
      background: "black",
    });
    return config;
  },
  (error) => {
    Message.error("請求錯誤:" + error.message);
    return Promise.reject(error);
  }
);

// 添加響應攔截器
instance.interceptors.response.use(
  ({ data }) => {
    loadingInstance.close();
    return data;
  },
  (error) => {
    loadingInstance.close();
    const config = error.config;
    // 沒有重試的請求直接拋出
    if (!config || !config.retry) {
      return Promise.reject(error);
    }

	// 超過重試次數(shù)拋出
    config.retryCount = config.retryCount || 0;
    if (config.retryCount >= config.retry) {
      // 因為每次請求的實例對象都不一樣,所以為當前實例添加 retryCount,不會影響其他實例
      return Promise.reject(error);
    }

	// 請求重試
    config.retryCount += 1;
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve(instance(config));
      }, config.retryDelay);
    });
  }
);

export default instance;

到了這里,關于vue2/3 axios 請求重試、取消請求、loading 串行并行等(分享)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • vue2前端使用axios發(fā)起post請求,后端(springboot)拿不到值解決辦法

    vue2前端使用axios發(fā)起post請求,后端(springboot)拿不到值解決辦法

    axios封裝-我常用的請求頭參數(shù)? application/json; charset=utf-8 頁面登錄請求-post 網(wǎng)絡請求正常傳入?yún)?shù) 后端代碼,查看控制臺發(fā)現(xiàn)都為null,沒取到值。 1.嘗試將前端post請求改成get,其他都不用變 發(fā)現(xiàn)正常取到值,打印輸出正常。前端頁面正常跳轉。 2.后端設置為post請求,前端a

    2024年02月02日
    瀏覽(22)
  • axios使用axiosSource.cancel取消請求后怎么恢復請求,axios取消請求和恢復請求實現(xiàn)

    axios使用axiosSource.cancel取消請求后怎么恢復請求,axios取消請求和恢復請求實現(xiàn)

    在前端做大文件分片上傳,或者其它中斷請求時,需要暫停或重新請求,比如這里大文件上傳時,可能會需要暫停、繼續(xù)上傳,如下GIF演示: 這里不詳細說文件上傳的處理和切片細節(jié),后續(xù)有時間在出一篇,大文件上傳,切片上傳、斷點續(xù)傳、秒傳等??。 不扯遠了,緊接本

    2024年02月12日
    瀏覽(22)
  • axios-retry插件-axios請求失敗自動重試

    axios-retry 對外導出 axiosRetry() 方法: 通過對 axios 單例添加“攔截器”,來擴展實現(xiàn)自動重試網(wǎng)絡請求功能。 備注: ?除非? shouldResetTimeout 被設置, 這個插件 將請求超時解釋為全局值, 不是針對每一個請求,二是全局的設置 Name Type Default Description retries Number 3 The number of times t

    2024年02月10日
    瀏覽(19)
  • Vue2 axios 發(fā)請求報400錯誤 “Error: Request failed with status code 400“

    Vue2 axios 發(fā)請求報400錯誤 “Error: Request failed with status code 400“

    最近在做一個項目,后端寫了一個登錄接口,postman可以正常請求。但我axios發(fā)請求出現(xiàn)400錯誤 \\\"Error: Request failed with status code 400\\\" 請求: 錯誤: ?我研究了兩天,查了無數(shù)資料,最后和朋友一起找到解決方法 原因:后端沒跟我說需要什么格式的數(shù)據(jù),我以為是默認的json,后來

    2024年02月11日
    瀏覽(28)
  • 【Vue框架】Vue2中axios發(fā)送請求—安裝axios、配置全局域名、傳遞參數(shù)、axios原理之Promise(什么是Promise、使用原因、基本使用、相關API、async與await使用)

    【Vue框架】Vue2中axios發(fā)送請求—安裝axios、配置全局域名、傳遞參數(shù)、axios原理之Promise(什么是Promise、使用原因、基本使用、相關API、async與await使用)

    官網(wǎng): https://www.axios-http.cn/ 1.1.1 安裝axios庫 安裝 axios 通信庫: npm install axios -S 1.1.2 在全局中引入axios庫 全局在main.js中引入axios: import axios from \\\'axios\\\' 1.1.3 掛在原型對象 Vue.prototype.$axios = axios; 將 axios 掛載到Vue原型對象中,實現(xiàn)數(shù)據(jù)共享,節(jié)約內存空間。 此時在任何頁面都可

    2024年02月05日
    瀏覽(25)
  • axios中取消請求的使用

    1.全局定義一個axios控制器變量 axiosController 2.配置axios 對象signal 3.創(chuàng)建setAxiosController函數(shù) 導出變量、函數(shù) 每次調用axiosController.abort()方法后就需要重新調用setAxiosController; axios官網(wǎng) 取消請求 mdn官網(wǎng) AbortController在fetch中的使用

    2024年02月07日
    瀏覽(21)
  • axios取消請求CancelToken的用法

    axios中取消請求情況分為1:取消該請求之后的相同請求;2:取消該請求之前的相同請求 ##取消該請求之后的相同請求: 在使用 axios 發(fā)送請求時,如果在短時間內連續(xù)發(fā)送同一個請求,可能會出現(xiàn)請求結果混亂或重復響應的問題。為了避免這種情況,我們可以使用 axios 的取消

    2024年02月14日
    瀏覽(16)
  • Axios中使用CancelToken取消請求

    CancelToken 是一個用于取消請求的機制。它允許在請求還未完成時,通過取消請求來終止請求的發(fā)送。這在需要在某些情況下中止正在進行的請求時非常有用,比如文件上傳時取消上傳等。 以下是使用 CancelToken 的一般步驟: 首先,導入 Axios 庫和相關的依賴: 創(chuàng)建一個 Cancel

    2024年02月10日
    瀏覽(45)
  • Axios使用CancelToken取消重復請求

    Axios使用CancelToken取消重復請求

    處理重復請求:沒有響應完成的請求,再去請求一個相同的請求,會把之前的請求取消掉 新增一個 cancelRequest.js 文件 request.js

    2024年02月12日
    瀏覽(18)
  • axios如何取消請求,其原理是什么?

    原文合集地址如下,有需要的朋友可以關注 本文地址 axios 可以通過創(chuàng)建一個 CancelToken 來取消一個請求,基本原理是: 創(chuàng)建一個 CancelToken 的實例,它有一個 executor 函數(shù),可以通過調用 executor 參數(shù)中的 cancel 函數(shù)來取消請求。 在 axios 請求配置中指定 cancelToken 屬性,將 CancelToken 實例

    2024年02月12日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包