成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

axios基于常見(jiàn)業(yè)務(wù)場(chǎng)景的二次封裝(更新)

dailybird / 526人閱讀

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

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

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

攔截器
/**
 * 請(qǐng)求攔截器
 * @param  {} requestStart 請(qǐng)求開(kāi)始
 */
service.interceptors.request.use(
  config => {
    requestStart({ config });
    return config;
  },
  error => {
    Message.error("請(qǐng)求出錯(cuò)");
    Promise.reject(error);
  }
);
/**
 * 響應(yīng)攔截器
 * @param  {} requestEnd 1.請(qǐng)求結(jié)束
 * @param  {} responseResolve 2.請(qǐng)求錯(cuò)誤處理
 */
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ò)請(qǐng)求中,請(qǐng)不要重復(fù)操作!");
    } else {
      const { response } = error;
      Message.error({
        dangerouslyUseHTMLString: true,
        message: `

請(qǐng)求接口: ${ response.config.url }

請(qǐng)求方法 : ${ 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); } );
請(qǐng)求開(kāi)始

處理請(qǐng)求頭

處理請(qǐng)求參數(shù)

處理重復(fù)請(qǐng)求

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

全局錯(cuò)誤提醒,在需要前端自定義提醒的場(chǎ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 || "登錄超時(shí),請(qǐng)重新登錄!");
        window.location.href = process.env.VUE_APP_AUTH_URL;
        return Promise.reject(data);
      default:
        //可配置錯(cuò)誤提醒
        if (!config.headers["hide-message"]) {
          Message.error(text || "操作失敗!");
        }
        return Promise.reject(data);
    }
  } else {
    Message.error(text || "操作失??!");
    store.commit("setLoading", false);
    return Promise.reject(data);
  }
};
請(qǐng)求結(jié)束

處理重復(fù)請(qǐng)求

處理分頁(yè)

處理loading狀態(tài)

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

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

token

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

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

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

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

/**
 * 處理重復(fù)請(qǐng)求
 * @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ù)請(qǐng)求:" + 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ù)請(qǐng)求
 * @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ù)請(qǐng)求:" + config.url);
      pending.splice(index, 1);
    }
  });
};
/**
 * 請(qǐng)求頭預(yù)處理
 * @param  {} {config} AxiosRequestConfig
 */
const requestHeaders = ({ config }) => {
  //1.時(shí)間戳
  const timestamp = new Date().getTime();
  config.headers.timestamp = timestamp;
  //2.token
  const token = sessionStorage.getItem("token");
  if (token) {
    config.headers.token = token;
  }
};
/**
 * 請(qǐng)求參數(shù)預(yù)處理
 * @param  {} {config}={} AxiosRequestConfig
 */
const requestParams = ({ config } = {}) => {
  //配置分頁(yè)
  if (config.headers.pagination) {
    const { pageNum, pageSize } = store.getters.getPagination;
    config.data = Object.assign({}, config.data, {
      pageNum,
      pageSize
    });
  }
};
/**
 * 請(qǐng)求開(kāi)始&&loading=true
 * @param  {} requestHeaders 1.配置請(qǐng)求頭
 * @param  {} requestParams 2.配置請(qǐng)求體
 * @param  {} removePending 3.處理重復(fù)請(qǐng)求
 */
const requestStart = ({ config } = {}) => {
  requestHeaders({ config });
  requestParams({ config });
  removePending({ config });
  addPending({ config });
  store.commit("setLoading", true);
};
/**
 * 請(qǐng)求結(jié)束&&loading=false
 * @param  {} {config}={} AxiosRequestConfig
 * @param  {} {config}={} response body
 */
const requestEnd = ({ config, data } = {}) => {
  removePending({ config });
  store.commit("setLoading", false);
  //配置分頁(yè)
  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 || "登錄超時(shí),請(qǐng)重新登錄!");
        window.location.href = process.env.VUE_APP_AUTH_URL;
        return Promise.reject(data);
      default:
        //可配置錯(cuò)誤提醒
        if (!config.headers["hide-message"]) {
          Message.error(text || "操作失?。?);
        }
        return Promise.reject(data);
    }
  } else {
    Message.error(text || "操作失??!");
    store.commit("setLoading", false);
    return Promise.reject(data);
  }
};
/**
 * 請(qǐng)求攔截器
 * @param  {} requestStart 請(qǐng)求開(kāi)始
 */
service.interceptors.request.use(
  config => {
    requestStart({ config });
    return config;
  },
  error => {
    Message.error("請(qǐng)求出錯(cuò)");
    Promise.reject(error);
  }
);
/**
 * 響應(yīng)攔截器
 * @param  {} requestEnd 1.請(qǐng)求結(jié)束
 * @param  {} responseResolve 2.請(qǐng)求錯(cuò)誤處理
 */
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ò)請(qǐng)求中,請(qǐng)不要重復(fù)操作!");
    } else {
      const { response } = error;
      Message.error({
        dangerouslyUseHTMLString: true,
        message: `

請(qǐng)求接口: ${ response.config.url }

請(qǐng)求方法 : ${ 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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

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

相關(guān)文章

  • axios基于常見(jiàn)業(yè)務(wù)場(chǎng)景二次封裝

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

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

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

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

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

    hersion 評(píng)論0 收藏0
  • axios入門(mén)實(shí)踐

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

    kamushin233 評(píng)論0 收藏0
  • 前端基本功-常見(jiàn)概念(一)

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

    bladefury 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<