• <ul id="cgeq2"></ul>
  • 歡迎您光臨深圳塔燈網絡科技有限公司!
    電話圖標 余先生:13699882642

    網站百科

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

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

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

    窗外,是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.juherenli.com/25245.html
    相關小程序
     八年  行業經驗

    多一份參考,總有益處

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

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

    業務熱線:余經理:13699882642

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

    含羞草国产亚洲精品岁国产精品| 国产精品青草视频免费播放| 亚洲精品乱码久久久久久中文字幕| 久久91精品国产91| 国语精品一区二区三区| 精品综合久久久久久99| 亚洲精品私拍国产福利在线| 亚洲精品网站在线观看不卡无广告| 久久精品久噜噜噜久久| 亚洲国产精品无码久久SM| 国产69精品久久久久妇女| 国产精品资源在线观看网站| 国99精品无码一区二区三区| 一区精品麻豆入口| 精品日产一卡2卡三卡4卡自拍| 欧洲精品99毛片免费高清观看| 大伊香蕉精品一区视频在线 | 久久久久成人精品一区二区| 国产69久久精品成人看小说 | japanese乱人伦精品| 久久精品日韩av无码| 91久久国产精品| 日韩精品成人一区二区三区| 精品久久久久中文字幕一区| 国产麻豆精品在线观看| 亚洲首页国产精品丝袜| 中文字幕亚洲精品资源网| 亚洲av午夜福利精品一区人妖| 69堂国产成人精品视频不卡 | 91热久久免费精品99| 国产成人精品午夜福利| 中文字幕一区精品| 亚洲国产精品13p| 国产精品免费电影| 含羞草国产亚洲精品岁国产精品| 国产精品网站在线观看| 中文字幕精品视频| 麻豆国产精品无码视频| 久久精品国产亚洲精品2020| 亚洲AV无码国产精品麻豆天美| 国产综合精品一区二区三区|