小程序如何自主實(shí)現(xiàn)攔截器的示例代碼
在一些框架中發(fā)現(xiàn)會(huì)提供一個(gè)很實(shí)用的功能:攔截器(interceptor)。例如要實(shí)現(xiàn)這個(gè)需求:小程序每次獲取到定位后都存到 globalData 里:
wx.getLocation({ // .. success(res) { getApp().globalData.location = res // ... } })
如果每一處使用 wx.getLocation 的地方都這么寫(xiě)也沒(méi)啥大問(wèn)題,但總顯得不夠“智能”,一方面是多了重復(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 }
很簡(jiǎn)單,暴露出 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) 通用處理。
更多使用場(chǎng)景
上面的場(chǎng)景比較簡(jiǎn)單,攔截器的應(yīng)用還有更多場(chǎng)景。比如每次請(qǐng)求傳參帶上公參經(jīng)緯度,接口返回的數(shù)據(jù)都會(huì)約定包裹在 object 中,請(qǐng)求回來(lái)需要取一遍。數(shù)據(jù)異常時(shí)還要針對(duì)錯(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)方法就不多寫(xiě),基于上述實(shí)現(xiàn)完善代碼即可。
總結(jié)
細(xì)心的讀者可能發(fā)現(xiàn),我們代理或者改造了很多微信提供的方法,有些開(kāi)發(fā)者可能不喜歡這樣,希望保持原有代碼的純潔性。這要看團(tuán)隊(duì)喜好吧,基于此考慮,主要是不想定義太多新的方法或 api,盡量以大家最為熟悉的方式書(shū)寫(xiě)代碼。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
小程序?qū)崿F(xiàn)按下錄音松開(kāi)識(shí)別語(yǔ)音
這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)按下錄音松開(kāi)識(shí)別語(yǔ)音,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11js提示框替代系統(tǒng)alert,自動(dòng)關(guān)閉alert對(duì)話(huà)框的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇js提示框替代系統(tǒng)alert,自動(dòng)關(guān)閉alert對(duì)話(huà)框的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11用javascript將數(shù)據(jù)導(dǎo)入Excel示例代碼
將數(shù)據(jù)導(dǎo)入Excel的方法有很多,本例介紹的這個(gè)是使用js來(lái)實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入,感興趣的朋友可以了解下2014-09-09