国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

axios基于常見業(yè)務(wù)場景的二次封裝(更新)

dailybird / 461人閱讀

摘要:時隔一年再次更新下根據(jù)項(xiàng)目下常見業(yè)務(wù)場景對的二次封裝功能實(shí)現(xiàn)兼容瀏覽器避免緩存減少或更新重復(fù)請求接口域名使用環(huán)境變量全局狀態(tài)可關(guān)閉的全局錯誤提醒可開啟攜帶全局分頁參數(shù)攔截器請求攔截器請求開始請求出錯響應(yīng)攔截器請求結(jié)束請求錯誤處理網(wǎng)絡(luò)請求中,

時隔一年再次更新下根據(jù)vue項(xiàng)目下常見業(yè)務(wù)場景對axios的二次封裝

功能實(shí)現(xiàn):
1.兼容ie瀏覽器避免緩存
2.減少或更新重復(fù)請求
3.接口域名使用環(huán)境變量
4.全局loading狀態(tài)
5.可關(guān)閉的全局錯誤提醒
6.可開啟攜帶全局分頁參數(shù)
7...

攔截器
/**
 * 請求攔截器
 * @param  {} requestStart 請求開始
 */
service.interceptors.request.use(
  config => {
    requestStart({ config });
    return config;
  },
  error => {
    Message.error("請求出錯");
    Promise.reject(error);
  }
);
/**
 * 響應(yīng)攔截器
 * @param  {} requestEnd 1.請求結(jié)束
 * @param  {} responseResolve 2.請求錯誤處理
 */
service.interceptors.response.use(
  response => {
    const { status, data, config } = response;
    requestEnd({ config, data });
    return responseResolve({ status, data, config });
  },
  error => {
    if (axios.isCancel(error)) {
      Message.warning("網(wǎng)絡(luò)請求中,請不要重復(fù)操作!");
    } else {
      const { response } = error;
      Message.error({
        dangerouslyUseHTMLString: true,
        message: `

請求接口: ${ response.config.url }

請求方法 : ${ response.config.method }

響應(yīng)狀態(tài) : ${response.status}

響應(yīng)信息 : ${ response.statusText }

` }); } store.commit("setLoading", false); store.commit("setPageTotal", 0); return Promise.reject(error); } );
請求開始

處理請求頭

處理請求參數(shù)

處理重復(fù)請求

/**
 * 請求開始&&loading=true
 * @param  {} requestHeaders 請求頭
 * @param  {} requestParams 請求參數(shù)
 * @param  {} removePending 重復(fù)請求
 */
const requestStart = ({ config } = {}) => {
  requestHeaders({ config });
  requestParams({ config });
  removePending({ config });
  addPending({ config });
  store.commit("setLoading", true);
};
請求響應(yīng)

全局錯誤提醒,在需要前端自定義提醒的場景下可關(guān)閉

/**
 * @param  {} {status HTTP狀態(tài)碼
 * @param  {} data 響應(yīng)體
 * @param  {} config}={} AxiosRequestConfig
 */
const responseResolve = ({ status, data, config } = {}) => {
  const { code, text } = data;
  if (status === 200) {
    switch (code) {
      case 200:
        return Promise.resolve(data);
      case 900401:
        Message.error(text || "登錄超時,請重新登錄!");
        window.location.href = process.env.VUE_APP_AUTH_URL;
        return Promise.reject(data);
      default:
        //可配置錯誤提醒
        if (!config.headers["hide-message"]) {
          Message.error(text || "操作失敗!");
        }
        return Promise.reject(data);
    }
  } else {
    Message.error(text || "操作失敗!");
    store.commit("setLoading", false);
    return Promise.reject(data);
  }
};
請求結(jié)束

處理重復(fù)請求

處理分頁

處理loading狀態(tài)

/**
 * 請求結(jié)束&&loading=false
 * @param  {} {config}={} AxiosRequestConfig
 * @param  {} {config}={} response body
 */
const requestEnd = ({ config, data } = {}) => {
  removePending({ config });
  store.commit("setLoading", false);
  //配置分頁
  if (config.headers.pagination) {
    const { data: content } = data;
    if (content) {
      store.commit("setPageTotal", content.total);
    }
  }
};
以下為具體功能實(shí)現(xiàn) 請求頭預(yù)處理

時間戳:避免ie內(nèi)核瀏覽器緩存

token

/**
 * 請求頭預(yù)處理
 * @param  {} {config} AxiosRequestConfig
 */
const requestHeaders = ({ config }) => {
  //1.時間戳
  const timestamp = new Date().getTime();
  config.headers.timestamp = timestamp;
  //2.token
  const token = sessionStorage.getItem("token");
  if (token) {
    config.headers.token = token;
  }
};
請求參數(shù)預(yù)處理

可配置的全局分頁參數(shù),提供給需要用到全局分頁組件的列表請求使用

/**
 * 請求參數(shù)預(yù)處理
 * @param  {} {config}={} AxiosRequestConfig
 */
const requestParams = ({ config } = {}) => {
  //配置分頁
  if (config.headers.pagination) {
    const { pageNum, pageSize } = store.getters.getPagination;
    config.data = Object.assign({}, config.data, {
      pageNum,
      pageSize
    });
  }
};
處理重復(fù)請求

此處根據(jù)需要可以改為取消上一次的請求

/**
 * 處理重復(fù)請求
 * @param  {} {config}={} AxiosRequestConfig
 */
const addPending = ({ config }) => {
  const url =
    config.url + "&" + config.method + "&" + qs.stringify(config.data);
  config.cancelToken = new cancelToken(cancel => {
    if (!pending.some(item => item.url === url)) {
      pending.push({
        url,
        cancel
      });
    }
  });
};
const removePending = ({ config }) => {
  const url =
    config.url + "&" + config.method + "&" + qs.stringify(config.data);
  pending.forEach((item, index) => {
    if (item.url === url) {
      item.cancel("取消重復(fù)請求:" + config.url);
      pending.splice(index, 1);
    }
  });
};
完整代碼
import { Message } from "element-ui";
import axios from "axios";
import store from "../store/index";
const qs = require("qs");

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 100000
});

const pending = [];
const cancelToken = axios.CancelToken;

/**
 * 處理重復(fù)請求
 * @param  {} {config}={} AxiosRequestConfig
 */
const addPending = ({ config }) => {
  const url =
    config.url + "&" + config.method + "&" + qs.stringify(config.data);
  config.cancelToken = new cancelToken(cancel => {
    if (!pending.some(item => item.url === url)) {
      pending.push({
        url,
        cancel
      });
    }
  });
};
const removePending = ({ config }) => {
  const url =
    config.url + "&" + config.method + "&" + qs.stringify(config.data);
  pending.forEach((item, index) => {
    if (item.url === url) {
      item.cancel("取消重復(fù)請求:" + config.url);
      pending.splice(index, 1);
    }
  });
};
/**
 * 請求頭預(yù)處理
 * @param  {} {config} AxiosRequestConfig
 */
const requestHeaders = ({ config }) => {
  //1.時間戳
  const timestamp = new Date().getTime();
  config.headers.timestamp = timestamp;
  //2.token
  const token = sessionStorage.getItem("token");
  if (token) {
    config.headers.token = token;
  }
};
/**
 * 請求參數(shù)預(yù)處理
 * @param  {} {config}={} AxiosRequestConfig
 */
const requestParams = ({ config } = {}) => {
  //配置分頁
  if (config.headers.pagination) {
    const { pageNum, pageSize } = store.getters.getPagination;
    config.data = Object.assign({}, config.data, {
      pageNum,
      pageSize
    });
  }
};
/**
 * 請求開始&&loading=true
 * @param  {} requestHeaders 1.配置請求頭
 * @param  {} requestParams 2.配置請求體
 * @param  {} removePending 3.處理重復(fù)請求
 */
const requestStart = ({ config } = {}) => {
  requestHeaders({ config });
  requestParams({ config });
  removePending({ config });
  addPending({ config });
  store.commit("setLoading", true);
};
/**
 * 請求結(jié)束&&loading=false
 * @param  {} {config}={} AxiosRequestConfig
 * @param  {} {config}={} response body
 */
const requestEnd = ({ config, data } = {}) => {
  removePending({ config });
  store.commit("setLoading", false);
  //配置分頁
  if (config.headers.pagination) {
    const { data: content } = data;
    if (content) {
      store.commit("setPageTotal", content.total);
    }
  }
};
/**
 * @param  {} {status HTTP狀態(tài)碼
 * @param  {} data 響應(yīng)體
 * @param  {} config}={} AxiosRequestConfig
 */
const responseResolve = ({ status, data, config } = {}) => {
  const { code, text } = data;
  if (status === 200) {
    switch (code) {
      case 200:
        return Promise.resolve(data);
      case 900401:
        Message.error(text || "登錄超時,請重新登錄!");
        window.location.href = process.env.VUE_APP_AUTH_URL;
        return Promise.reject(data);
      default:
        //可配置錯誤提醒
        if (!config.headers["hide-message"]) {
          Message.error(text || "操作失敗!");
        }
        return Promise.reject(data);
    }
  } else {
    Message.error(text || "操作失敗!");
    store.commit("setLoading", false);
    return Promise.reject(data);
  }
};
/**
 * 請求攔截器
 * @param  {} requestStart 請求開始
 */
service.interceptors.request.use(
  config => {
    requestStart({ config });
    return config;
  },
  error => {
    Message.error("請求出錯");
    Promise.reject(error);
  }
);
/**
 * 響應(yīng)攔截器
 * @param  {} requestEnd 1.請求結(jié)束
 * @param  {} responseResolve 2.請求錯誤處理
 */
service.interceptors.response.use(
  response => {
    const { status, data, config } = response;
    requestEnd({ config, data });
    return responseResolve({ status, data, config });
  },
  error => {
    if (axios.isCancel(error)) {
      Message.warning("網(wǎng)絡(luò)請求中,請不要重復(fù)操作!");
    } else {
      const { response } = error;
      Message.error({
        dangerouslyUseHTMLString: true,
        message: `

請求接口: ${ response.config.url }

請求方法 : ${ response.config.method }

響應(yīng)狀態(tài) : ${response.status}

響應(yīng)信息 : ${ response.statusText }

` }); } store.commit("setLoading", false); store.commit("setPageTotal", 0); return Promise.reject(error); } ); export default service;

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/106002.html

相關(guān)文章

  • axios基于常見業(yè)務(wù)場景二次封裝

    摘要:是一個基于的庫,可以用在瀏覽器和中。我在最近的幾個項(xiàng)目中都有使用,并基于根據(jù)常見的業(yè)務(wù)場景封裝了一個通用的服務(wù)。業(yè)務(wù)場景全局請求配置。請求攜帶,權(quán)限錯誤統(tǒng)一管理。 axios axios 是一個基于 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。在前端框架中的應(yīng)用也是特別廣泛,不管是vue還是react,都有很多項(xiàng)目用axios作為網(wǎng)絡(luò)請求庫。我在最近的幾個項(xiàng)...

    JasinYip 評論0 收藏0
  • axios 二次封裝(攔截重復(fù)請求、異常統(tǒng)一處理)

    摘要:攔截重復(fù)請求如何標(biāo)識每個請求下面函數(shù),通過一個請求參數(shù)中的請求傳遞參數(shù)或請求傳遞參數(shù)來表示每一個請求。 一直想封裝一下 axios, 可以方便項(xiàng)目中使用,今天有時間,就好好研究了一下。 源碼: // util/axios.js import axios from axios const pending = {} const CancelToken = axios.CancelTok...

    luzhuqun 評論0 收藏0
  • 如何構(gòu)建通用存儲中間層

    摘要:并且數(shù)據(jù)同步后默認(rèn)會保存下來,這樣下次再請求時存儲層中就有數(shù)據(jù)了。以下參數(shù)會傳到中這么一來,存儲層就和接口層對接起來了。五支持永久保存在某些場景下,可能不方便寫過期時間,這時默認(rèn)可以傳遞,標(biāo)記該數(shù)據(jù)永不過期。 零、問題的由來 開門見山地說,這篇文章【又】是一篇安利軟文~,安利的對象就是 tua-storage。 顧名思義,這就是一款存儲數(shù)據(jù)的工具。 用 tua-storage 好處大大...

    hersion 評論0 收藏0
  • axios入門實(shí)踐

    摘要:使用了攔截器處理相關(guān)問題,這樣就不再需要使用來做錯誤的處理。萬惡的攔截器一些處理無論是對成功的處理還是對失敗的處理,如果攔截器不拋出錯誤,那么終將還會執(zhí)行里面處理請求成功的函數(shù),即使你返回。 一 前言 本文適合剛接觸axios或者使用過幾次的同學(xué)來分享交流一些入門經(jīng)驗(yàn),本文同樣適用熟悉axios的同學(xué)來作為參考手冊。默認(rèn)你已經(jīng)看過axios的相關(guān)文檔:axios文檔 GitHub,通過...

    kamushin233 評論0 收藏0
  • 前端基本功-常見概念(一)

    摘要:前端基本功常見概念一點(diǎn)這里前端基本功常見概念二點(diǎn)這里前端基本功常見概念三點(diǎn)這里什么是原型鏈當(dāng)一個引用類型繼承另一個引用類型的屬性和方法時候就會產(chǎn)生一個原型鏈。函數(shù)式編程是聲明式而不是命令式,并且應(yīng)用程序狀態(tài)通過純函數(shù)流轉(zhuǎn)。 前端基本功-常見概念(一) 點(diǎn)這里前端基本功-常見概念(二) 點(diǎn)這里前端基本功-常見概念(三) 點(diǎn)這里 1.什么是原型鏈 當(dāng)一個引用類型繼承另一個引用類型的屬性和方...

    bladefury 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<