用axios攔截器實(shí)現(xiàn)一個(gè)友好提示

簡介

axios的攔截器是一個(gè)非常優(yōu)秀的設(shè)計(jì)珊佣,借助它我們可以實(shí)現(xiàn)很多效果堂油,節(jié)省重復(fù)的代碼。

今天重點(diǎn)不是介紹axios,而是帶領(lǐng)大家實(shí)現(xiàn)一個(gè)在網(wǎng)絡(luò)較慢時(shí)彈出友好提示的攔截器祝钢。類似與下面的效果比规。


image.png

大家可以到這里來體驗(yàn): http://ngzhixiao.gitee.io/heiibaiitoy/articles/axios/slownetwork/index.html

如果大家是在電腦上訪問的話,可以打開控制臺(tái)的network選擇網(wǎng)絡(luò)的slow 3G會(huì)更接近真實(shí)的體驗(yàn)
image.png

實(shí)現(xiàn)

// 記錄當(dāng)前請求發(fā)出但未返回的id
    const requestMap = new Set()

    function generateId(url) {
      return url+new Date().getTime()+Math.random()
    }

    /**
     * 慢網(wǎng)絡(luò)提示攔截器拦英,在網(wǎng)絡(luò)慢的情況提示用戶等待
     */
    const slowNetworkInterceptor = function(axios, slowTime = 5000) {

      if(!axios.defaults.headers.common.__config){
        axios.defaults.headers.common.__config = {}
      }

      axios.defaults.headers.common.__config.slowNetworkConfig = {
        slowTime, // 定義網(wǎng)絡(luò)慢的條件
        close: false,  // 允許在某些接口關(guān)閉提示
      }

      axios.interceptors.request.use(config => {
        const snc = config.headers.common.__config.slowNetworkConfig
        if(snc.close) return config
        const id = generateId(config.url)
        requestMap.add(id)
        snc.id = id
        setTimeout(() => {
          if(requestMap.has(id)) {
            Toast("網(wǎng)絡(luò)似乎正在開小差蜒什,請耐心等待噢(? ˙o˙)?")
            requestMap.delete(id)
          }
        }, snc.slowTime);
        return config
      }, err => Promise.reject(err))

      axios.interceptors.response.use(res => {
        const snc = res.config.headers.__config.slowNetworkConfig
        if(snc.close) return res
        requestMap.delete(snc.id)
        return res
      }, err => {
        const snc = err.config.headers.__config.slowNetworkConfig
        if(snc.close) return Promise.reject(err)
        requestMap.delete(snc.id)
        return Promise.reject(err)
      })

      return axios
    }

    slowNetworkInterceptor(axios)

代碼如上所示。

在每次請求時(shí)會(huì)生成一個(gè)id并將其存儲(chǔ)到請求配置config中龄章,用來標(biāo)記這個(gè)請求吃谣。在最開始的時(shí)候我們定義了一個(gè)記錄發(fā)出但未返回的網(wǎng)絡(luò)請求的requestMap,將這個(gè)請求的id記錄下來做裙。然后開啟一個(gè)定時(shí)器(我們默認(rèn)給它一個(gè)5s)岗憋,如果5s內(nèi)請求返回了,就在返回的攔截器刪除掉對應(yīng)的id锚贱;如果5s內(nèi)還未返回仔戈,我們就彈框提示用戶當(dāng)前網(wǎng)絡(luò)較慢。

其中有一個(gè)細(xì)節(jié)拧廊,為什么id和定時(shí)器時(shí)長的信息不直接放到請求對象的config中而是放在headers上呢监徘?放到headers上不久隨著請求發(fā)出去了嗎?

其實(shí)這axios的實(shí)現(xiàn)有關(guān)吧碾,在真正的發(fā)出請求前凰盔,axios會(huì)把config中的參數(shù)進(jìn)行一個(gè)合并操作,但是只會(huì)合并它定義的一些參數(shù)倦春,所以如果直接放到config上就會(huì)被排除掉户敬,而對headers時(shí)會(huì)進(jìn)行一個(gè)深拷貝,同時(shí)將common提上一級(jí)睁本,這也能解釋在請求攔截中設(shè)置在common中的參數(shù)為什么在返回?cái)r截中能直接在headers上拿到尿庐。

這會(huì)導(dǎo)致我們在請求頭多一個(gè)參數(shù),是這樣的:__config: [object Object]呢堰,但在大多數(shù)情況下這沒什么影響抄瑟。

總結(jié)

這只是攔截器的其中一種用法,其實(shí)在實(shí)際的開發(fā)過程中枉疼,我們還可以通過攔截器實(shí)現(xiàn)請求的簽名皮假、請求數(shù)據(jù)的加解密、甚至能實(shí)現(xiàn)緩存請求的緩存等操作往衷。

axios是一個(gè)設(shè)計(jì)很巧妙的庫钞翔,而且他的代碼很短,是學(xué)習(xí)優(yōu)秀開源庫很好的例子席舍,推薦有時(shí)間都能去看看它的源碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哮笆,一起剝皮案震驚了整個(gè)濱河市来颤,隨后出現(xiàn)的幾起案子汰扭,更是在濱河造成了極大的恐慌,老刑警劉巖福铅,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萝毛,死亡現(xiàn)場離奇詭異,居然都是意外死亡滑黔,警方通過查閱死者的電腦和手機(jī)笆包,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來略荡,“玉大人庵佣,你說我怎么就攤上這事⊙炊担” “怎么了巴粪?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粥谬。 經(jīng)常有香客問我肛根,道長,這世上最難降的妖魔是什么漏策? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任派哲,我火速辦了婚禮,結(jié)果婚禮上掺喻,老公的妹妹穿的比我還像新娘芭届。我一直安慰自己,他們只是感情好巢寡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布喉脖。 她就那樣靜靜地躺著,像睡著了一般抑月。 火紅的嫁衣襯著肌膚如雪树叽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天谦絮,我揣著相機(jī)與錄音题诵,去河邊找鬼。 笑死层皱,一個(gè)胖子當(dāng)著我的面吹牛性锭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叫胖,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼草冈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起怎棱,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哩俭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拳恋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凡资,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年谬运,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隙赁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梆暖,死狀恐怖伞访,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情式廷,我是刑警寧澤咐扭,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站滑废,受9級(jí)特大地震影響蝗肪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蠕趁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一薛闪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俺陋,春花似錦豁延、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缴挖,卻和暖如春袋狞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背映屋。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工苟鸯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棚点。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓早处,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瘫析。 傳聞我的和親對象是個(gè)殘疾皇子砌梆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容