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

詳解如何消除axios攔截中的if

 更新時(shí)間:2022年04月17日 09:59:15   作者:科目三后吃飯  
在使用vue的開發(fā)中,我們會(huì)使用axios來做前后端通信,那這時(shí)候我們就需要對請求前后做攔截,下面這篇文章主要給大家介紹了關(guān)于如何消除axios攔截中if的相關(guān)資料,需要的朋友可以參考下

基本攔截

axios的響應(yīng)錯(cuò)誤攔截中,難免會(huì)對error.status做各種各樣的if判斷,又或者switch。為了防止枯燥乏味的生活(給自己挖坑,換一種姿勢去寫攔截

// 以下大概是日常碰到的操作,攔截響應(yīng),判斷status做相應(yīng)操作
function login () {
  console.log('登陸邏輯')
  return promise.reject(error)
}
// 添加響應(yīng)攔截器
axios.interceptors.response.use(function (response) {
  // 對響應(yīng)數(shù)據(jù)做點(diǎn)什么
  return response;
}, function (error) {
  if (error.status === 401) {
    // 401重新登錄
    console.log('未登陸')
    return login(error)
  } else if (error.status === 404) {
    console.log('404-什么都沒')
    return promise.reject(error)
  } else if (error.status === 422) {
    console.log(error.response.data.message)
    return promise.reject(error)
  } else if (error.status === 500) {
    console.log('服務(wù)器內(nèi)部錯(cuò)誤')
    return promise.reject(error)
  } else {
    // 其他請求,直接拋出讓業(yè)務(wù)去處理
    return promise.reject(error)
  }
});

設(shè)計(jì)輪子

思考方向

首先思考下怎么實(shí)現(xiàn)這個(gè)東西

  • 需要一個(gè)在內(nèi)部消化if的邏輯判斷
  • 根據(jù)判斷去執(zhí)行相應(yīng)的邏輯,意味著我們要在內(nèi)部維護(hù)一個(gè)邏輯數(shù)組(以下稱為管道數(shù)組),配合成功后即觸發(fā)對應(yīng)管道。所以在開始調(diào)用函數(shù)去執(zhí)行前,先要收集好管道。這個(gè)方法需要傳一個(gè)標(biāo)記(用來判斷是否匹配)和回調(diào)函數(shù)(匹配成功后的邏輯)
  • 除了傳標(biāo)記,需要傳一個(gè)payload(例如攔截中的error)參數(shù),payload可以讓我們在回調(diào)函數(shù)做出更多的對應(yīng)操作
  • 在最后再添加一個(gè)default函數(shù)來收集匹配失敗后的函數(shù)。

現(xiàn)在,已經(jīng)在心中擬好了一個(gè)小輪子的五臟六腑。

輪子骨架

// 定義個(gè)一個(gè)class
class Enterclose {
  constructor () {
    // 維護(hù)管道數(shù)組
    this.pond = {}
    // 默認(rèn)管道
    this._default = null
  }
  /**
   * 收集管道
   * callback(payload)
   * @param {any} sign 標(biāo)記
   * @param {Function|Object} callback 回調(diào)函數(shù)|函數(shù)this
   * @return this
   * */
  use (sign, callback) {
    return this
  }
  /**
   * 收集匹配失敗的管道
   * callback(payload)
   * @param {Function} callback 回調(diào)函數(shù)|函數(shù)this
   * @return this
   * */
  default (callback) {
    this._default = callback
    return this
  }
  /**
   * 執(zhí)行管道流
   * @param {any} sign 標(biāo)記
   * @param {any} payload
   * @return
   */
  start (sign, payload) {
  }
}

詳細(xì)實(shí)現(xiàn)

以上把基本的api骨架寫好,然后再一個(gè)一個(gè)慢慢實(shí)現(xiàn)內(nèi)部的邏輯。

首先是use,用來收集管道,需求中標(biāo)記是唯一的,所以我們的this.ponds的結(jié)構(gòu)是{標(biāo)記: callback}

use (sign, callback) {
    this.ponds[sign] = callback
    return this
}

其中我們需要一個(gè)方法用來啟動(dòng)Enterclose

通過getCallback函數(shù)去篩選和標(biāo)記匹配的管道,返回對應(yīng)的函數(shù)。這樣一個(gè)消除if的小輪子就搞好啦

start (sign, payload) {
    const fn = this.getCallback(sign)
    if (fn) {
      return fn(payload)
    }
}
/**
* 根據(jù)標(biāo)記獲取函數(shù)
* @param {*} sign 
* @return {Function}
*/
getCallback (sign) {
    const key = Object.keys(this.ponds).find(key => key === sign)
    if (key) {
      return this.ponds[key]
    } else if (this._default) {
      return this._default
    }
}

實(shí)踐

創(chuàng)建實(shí)例,用use和default收集管道,然后在攔截中通過start觸發(fā)判斷

const enterclose = new Enterclose()
// 收集管道
enterclose
.use(401, function (error) {
  console.log('未登陸')
  return login(error)
})
.use(404, function (error) {
  console.log('404-什么都沒')
  return promise.reject(error)
})
.use(429, function (error) {
  console.log(error.response.data.message)
  return promise.reject(error)
})
.use(500, function (error) {
  console.log('服務(wù)器內(nèi)部錯(cuò)誤')
  return promise.reject(error)
})
.default(function (error) {
  // 收集默認(rèn)管道
  return promise.reject(error)
})
axios.interceptors.response.use(function (response) {
  // 對響應(yīng)數(shù)據(jù)做點(diǎn)什么
  return response;
}, function (error) {
  // 啟動(dòng)
  return enterclose.start(error.status, error)
});

你也可以根據(jù)自己的場景做一些調(diào)整,例如支持Promise啊,或者說加一個(gè)finally函數(shù),每次走管道最后都會(huì)調(diào)用這個(gè)回調(diào)函數(shù)之類

總結(jié)

到此這篇關(guān)于如何消除axios攔截中if的文章就介紹到這了,更多相關(guān)消除axios攔截的if內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用JavaScript實(shí)現(xiàn)頁面局部更新的方法總結(jié)

    使用JavaScript實(shí)現(xiàn)頁面局部更新的方法總結(jié)

    在JavaScript中,Ajax(Asynchronous JavaScript and XML)是一種用于在后臺(tái)與服務(wù)器進(jìn)行異步通信的技術(shù),本文給大家介紹了使用JavaScript實(shí)現(xiàn)頁面局部更新的三種方法,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Openlayers顯示地理位置坐標(biāo)的方法

    Openlayers顯示地理位置坐標(biāo)的方法

    這篇文章主要為大家詳細(xì)介紹了Openlayers顯示地理位置坐標(biāo),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • 防止video視頻被下載的處理方法匯總

    防止video視頻被下載的處理方法匯總

    這篇文章主要介紹了防止video視頻被下載的處理方法匯總,本文給大家介紹了多種方法幫助大家解決防止video視頻被下載的問題,補(bǔ)充介紹了解決video標(biāo)簽視頻禁止下載方法,感興趣的朋友一起看看吧
    2024-02-02
  • js變量聲明var使用與不使用的區(qū)別詳解

    js變量聲明var使用與不使用的區(qū)別詳解

    今天小編就為大家分享一篇關(guān)于js變量聲明var使用與不使用的區(qū)別詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • JS獲取隨機(jī)數(shù)函數(shù)可自定義最小值最大值

    JS獲取隨機(jī)數(shù)函數(shù)可自定義最小值最大值

    這篇文章主要介紹的是一個(gè)JS獲取隨機(jī)數(shù)的函數(shù)可自定義最小值最大值,需要的朋友可以參考下
    2014-05-05
  • JavaScript實(shí)現(xiàn)仿windows文件名稱排序

    JavaScript實(shí)現(xiàn)仿windows文件名稱排序

    在JavaScript中,數(shù)組排序是一個(gè)常見的操作,本文將通過一個(gè)具體的代碼示例,解釋如何實(shí)現(xiàn)一個(gè)仿windows文件名稱的排序算法,需要的可以參考下
    2024-12-12
  • JavaScript檢測并限制復(fù)選框選中個(gè)數(shù)的方法

    JavaScript檢測并限制復(fù)選框選中個(gè)數(shù)的方法

    這篇文章主要介紹了JavaScript檢測并限制復(fù)選框選中個(gè)數(shù)的方法,涉及javascript針對復(fù)選框的判定與運(yùn)算相關(guān)技巧,非常簡單實(shí)用,需要的朋友可以參考下
    2015-08-08
  • JS iFrame加載慢怎么解決

    JS iFrame加載慢怎么解決

    這篇文章主要介紹了JS iFrame加載慢的解決方法,非常實(shí)用,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • JavaScript代碼實(shí)現(xiàn)春晚劉謙魔術(shù)的模擬程序

    JavaScript代碼實(shí)現(xiàn)春晚劉謙魔術(shù)的模擬程序

    昨晚春晚上劉謙的兩個(gè)魔術(shù)表演都非常精彩,尤其是第二個(gè)魔術(shù),他演繹了經(jīng)典的約瑟夫環(huán)問題!約瑟夫環(huán)是一個(gè)經(jīng)典的數(shù)學(xué)問題,本文給出了完整的 JavaScript 代碼實(shí)現(xiàn),感興趣的同學(xué)可以自己動(dòng)手實(shí)現(xiàn)一下
    2024-02-02
  • 快速對接payjq的個(gè)人微信支付接口過程解析

    快速對接payjq的個(gè)人微信支付接口過程解析

    這篇文章主要介紹了快速對接payjq的個(gè)人微信支付接口過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評論

新河县| 榆林市| 四子王旗| 合肥市| 双辽市| 疏附县| 靖州| 郧西县| 岳西县| 淮阳县| 泸水县| 远安县| 三门峡市| 鲁甸县| 黎城县| 托克逊县| 格尔木市| 固原市| 潞西市| 浦东新区| 札达县| 诸暨市| 汶川县| 汪清县| 禹州市| 自贡市| 桦南县| 安陆市| 朝阳县| 东阳市| 临沂市| 图木舒克市| 山东省| 兴文县| 邻水| 永善县| 靖安县| 大邑县| 乐昌市| 翼城县| 吉林省|