歡迎您光臨深圳塔燈網(wǎng)絡(luò)科技有限公司!
          電話圖標(biāo) 余先生:13699882642

          網(wǎng)站百科

          為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴

          小程序技能進(jìn)階回憶錄 - 如何自主實(shí)現(xiàn)攔截器

          發(fā)表日期:2019-11 文章編輯:小燈 瀏覽次數(shù):4990

          窗外,是5月明媚的陽光,澄澈蔚藍(lán)的天空,有炮彈歡快地叫著飛過。50多年過去了,我依然如此清晰地記得。

          在一些框架中發(fā)現(xiàn)會(huì)提供一個(gè)很實(shí)用的功能:攔截器(interceptor)。例如要實(shí)現(xiàn)這個(gè)需求:小程序每次獲取到定位后都存到 globalData 里:

          wx.getLocation({
            // ..
            success(res) {
              getApp().globalData.location = res
              // ...
            }
          })

          如果每一處使用 wx.getLocation 的地方都這么寫也沒啥大問題,但總顯得不夠“智能”,一方面是多了重復(fù)代碼,另一方面如果需求變動(dòng),獲取到定位后存到別的地方,那要改很多次。

          優(yōu)雅的攔截器

          有了攔截器,可以更優(yōu)雅的實(shí)現(xiàn)它:

          intercept('getLocation', {
            success(res) {
              getApp().globalData.location = res
            }
          })

          只要在一處定義如上的攔截器,其他地方直接用 wx.getLocation 即可。那么,如何實(shí)現(xiàn)上面的方式呢?

          實(shí)現(xiàn) intercept 方法

          // utils/intercept.js
          // 存儲(chǔ)攔截器定義
          var interceptors = {}
          function intercept(key, config) {
            intercept[key] = config
          }
          export {
            intercept,
            interceptors
          }

          很簡單,暴露出 intercept 方法,定義一個(gè)存儲(chǔ)器也一并暴露出去。

          代理 wx

          要實(shí)現(xiàn)使用 wx.getLocation 自動(dòng)應(yīng)用攔截器,就必須基于原有方法重新定義它。

          import { interceptors } from './intercept'
          
          // 備份原有微信方法
          var wxBackup = {}
          [
            'getLocation'
            // 還可以有很多其他方法 ...
          ].forEach((key) => {
            wxBackup[key] = wx[key]
            wx[key] = (config) => {
              if (interceptors[key]) {
                // 備份業(yè)務(wù)代碼傳入的回調(diào)方法
                var backup = {}
                var interceptor = interceptors[key]
                [
                  'success',
                  'fail',
                  'complete'
                ].forEach((k) => {
                  backup[k] = config[k]
                  config[k] = (res) => {
                    interceptor[k](res)
                    backup[k](res)
                  }
                })
              }
              wxBackup[key](config)
            }
          })

          當(dāng)然,上述代碼用數(shù)組列出了所有可能被定義攔截器的微信函數(shù),也可以使用 Object.keys(wx) 通用處理。

          更多使用場景

          上面的場景比較簡單,攔截器的應(yīng)用還有更多場景。比如每次請求傳參帶上公參經(jīng)緯度,接口返回的數(shù)據(jù)都會(huì)約定包裹在 object 中,請求回來需要取一遍。數(shù)據(jù)異常時(shí)還要針對錯(cuò)誤碼做特定處理,就可以很方便的用攔截器處理:

          intercept('request', {
            data(data) {
              var location = getApp().globalData.location
              data.location = location.latitude + ',' + location.longitude
              return data
            },
            success(res) {
              if (res.code == 200) {
                return res.object
              } else {
                if (res.code == 'xxx') {
                  // 登錄失效,重新登錄
                  // ....
                }
              }
            }
          })

          注意,攔截器函數(shù)里多了返回值,具體實(shí)現(xiàn)方法就不多寫,基于上述實(shí)現(xiàn)完善代碼即可。

          總結(jié)

          細(xì)心的讀者可能發(fā)現(xiàn),我們代理或者改造了很多微信提供的方法,有些開發(fā)者可能不喜歡這樣,希望保持原有代碼的純潔性。這要看團(tuán)隊(duì)喜好吧,基于此考慮,主要是不想定義太多新的方法或 api,盡量以大家最為熟悉的方式書寫代碼。


          本頁內(nèi)容由塔燈網(wǎng)絡(luò)科技有限公司通過網(wǎng)絡(luò)收集編輯所得,所有資料僅供用戶學(xué)習(xí)參考,本站不擁有所有權(quán),如您認(rèn)為本網(wǎng)頁中由涉嫌抄襲的內(nèi)容,請及時(shí)與我們聯(lián)系,并提供相關(guān)證據(jù),工作人員會(huì)在5工作日內(nèi)聯(lián)系您,一經(jīng)查實(shí),本站立刻刪除侵權(quán)內(nèi)容。本文鏈接:http://www.cjxv.cn/25245.html
          相關(guān)小程序