• <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.    

    久久九九有精品国产23百花影院| 老色鬼永久精品网站| 国产伦精品一区二区免费| 久久久久久精品久久久| 久久久久久夜精品精品免费啦| 国产A三级久久精品| 国产剧情AV麻豆香蕉精品| 国产精品久久久久蜜芽| 久久ww精品w免费人成| 麻豆精品不卡国产免费看| 国产精品日韩深夜福利久久| 成人精品一区久久久久| 亚洲熟妇成人精品一区| 国产精品国产三级专区第1集 | 男人的天堂精品国产一区| 2020精品自拍视频曝光| 亚洲精品中文字幕乱码影院| 国产精品va无码一区二区| 久久精品国产WWW456C0M| 精品无码成人片一区二区| 日本精品卡一卡2卡三卡| 久久国产精品99国产精| 亚洲精品无码成人| 69国产成人综合久久精品| 2021国产成人午夜精品| 91精品福利视频| 91一区二区在线观看精品| 久久96国产精品| 亚洲国产精品一区二区久久| 国产成人精品2021| 亚洲高清国产AV拍精品青青草原| 国产亚洲婷婷香蕉久久精品| 亚洲精品无码av人在线观看| 国产无套精品一区二区| 伊人精品久久久大香线蕉99 | 国精品午夜福利视频不卡| 国产偷久久久精品专区| 亚洲精品中文字幕无码蜜桃| 久久国产亚洲精品麻豆| 久久国产精品久久久久久久久久| 日韩人妻精品一区二区三区视频 |