<address id="r9vd9"><address id="r9vd9"><listing id="r9vd9"></listing></address></address>

      歡迎您光臨深圳塔燈網絡科技有限公司!
      電話圖標 余先生:13699882642

      網站百科

      為您解碼網站建設的點點滴滴

      小程序技能進階回憶錄 - 如何自主實現攔截器

      發表日期:2019-11 文章編輯:小燈 瀏覽次數:4850

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

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

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

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

      優雅的攔截器

      有了攔截器,可以更優雅的實現它:

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

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

      實現 intercept 方法

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

      很簡單,暴露出 intercept 方法,定義一個存儲器也一并暴露出去。

      代理 wx

      要實現使用 wx.getLocation 自動應用攔截器,就必須基于原有方法重新定義它。

      import { interceptors } from './intercept'
      
      // 備份原有微信方法
      var wxBackup = {}
      [
        'getLocation'
        // 還可以有很多其他方法 ...
      ].forEach((key) => {
        wxBackup[key] = wx[key]
        wx[key] = (config) => {
          if (interceptors[key]) {
            // 備份業務代碼傳入的回調方法
            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)
        }
      })

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

      更多使用場景

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

      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') {
              // 登錄失效,重新登錄
              // ....
            }
          }
        }
      })

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

      總結

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


      本頁內容由塔燈網絡科技有限公司通過網絡收集編輯所得,所有資料僅供用戶學習參考,本站不擁有所有權,如您認為本網頁中由涉嫌抄襲的內容,請及時與我們聯系,并提供相關證據,工作人員會在5工作日內聯系您,一經查實,本站立刻刪除侵權內容。本文鏈接:http://www.webpost.com.cn/25245.html
      相關小程序
       八年  行業經驗

      多一份參考,總有益處

      聯系深圳網站公司塔燈網絡,免費獲得網站建設方案及報價

      咨詢相關問題或預約面談,可以通過以下方式與我們聯系

      業務熱線:余經理:13699882642

      Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

      国产成人精品综合在线观看