一区二区三区欧美日韩-一区二区三区欧美-一区二区三区免费在线视频-一区二区三区免费在线观看-久久精品店-久久精品第一页

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

網站百科

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

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

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

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

多一份參考,總有益處

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

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

業務熱線:余經理:13699882642

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

主站蜘蛛池模板: 乱子伦在线观看中文字幕| 好男人在线视频| 午夜影视不充值观看| 亚洲精品久久YY5099| 亚洲、国产综合视频| 中国女人内谢69XXXXXA片| 国产色婷婷亚洲99麻豆| 免费观看激烈日板子| 伊人青青久久| 调教美丽的白丝袜麻麻视频| 蜜臀AV浪潮99国产麻豆| 52色擼99热99| 国产免费人成在线视频有码| 手机看片国产免费久久网| 曰产无码久久久久久精品| 60岁老年熟妇在线无码| 精品无码一区二区三区中文字幕| 邪恶肉肉全彩色无遮盖| 国产麻豆精品久久一二三| 亚洲AV日韩AV欧美在线观看网| 国产在线观看成人| 青草国产超碰人人添人人碱| 亚洲永久精品ww47| 精品视频在线观看视频免费视频| 亚洲三级在线中文字幕| 久久国产高清字幕中文| 天天躁夜夜踩很很踩2022| 国产精品爆乳尤物99精品| 亚洲高清无在码在线无弹窗| 成人手机在线观看| 无码免费视频AAAAAA片草莓| 国产人妻人伦精品836700| 亚洲精品久久AV无码蜜桃 | 为什么丈夫插我我却喜欢被打着插| 冠希和阿娇13分钟在线视频| 香蕉视频国产精品| 久久精品热在线观看30| ppypp午夜限制不卡影院私人| 久久精品久久久久| 95国产欧洲精华液| 久久99这里只有精品|