為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴
發(fā)表日期:2019-11 文章編輯:小燈 瀏覽次數(shù):4649
窗外,是5月明媚的陽(yáng)光,澄澈蔚藍(lán)的天空,有炮彈歡快地叫著飛過(guò)。50多年過(guò)去了,我依然如此清晰地記得。
在一些框架中發(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)雅的實(shí)現(xiàn)它:
intercept('getLocation', {
success(res) {
getApp().globalData.location = res
}
})
只要在一處定義如上的攔截器,其他地方直接用 wx.getLocation
即可。那么,如何實(shí)現(xiàn)上面的方式呢?
// utils/intercept.js
// 存儲(chǔ)攔截器定義
var interceptors = {}
function intercept(key, config) {
intercept[key] = config
}
export {
intercept,
interceptors
}
很簡(jiǎn)單,暴露出 intercept
方法,定義一個(gè)存儲(chǔ)器也一并暴露出去。
要實(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)景比較簡(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)完善代碼即可。
細(xì)心的讀者可能發(fā)現(xiàn),我們代理或者改造了很多微信提供的方法,有些開(kāi)發(fā)者可能不喜歡這樣,希望保持原有代碼的純潔性。這要看團(tuán)隊(duì)喜好吧,基于此考慮,主要是不想定義太多新的方法或 api,盡量以大家最為熟悉的方式書(shū)寫(xiě)代碼。
日期:2019-11 瀏覽次數(shù):5524
日期:2019-11 瀏覽次數(shù):11982
日期:2019-11 瀏覽次數(shù):4351
日期:2019-11 瀏覽次數(shù):5385
日期:2019-11 瀏覽次數(shù):5260
日期:2019-11 瀏覽次數(shù):7180
日期:2019-11 瀏覽次數(shù):5165
日期:2019-11 瀏覽次數(shù):15768
日期:2019-11 瀏覽次數(shù):4718
日期:2019-11 瀏覽次數(shù):6517
日期:2019-11 瀏覽次數(shù):5371
日期:2019-11 瀏覽次數(shù):4564
日期:2019-11 瀏覽次數(shù):10763
日期:2019-11 瀏覽次數(shù):8320
日期:2019-11 瀏覽次數(shù):5079
日期:2019-11 瀏覽次數(shù):4311
日期:2019-11 瀏覽次數(shù):8952
日期:2019-11 瀏覽次數(shù):4648
日期:2019-11 瀏覽次數(shù):4845
日期:2019-11 瀏覽次數(shù):4865
日期:2019-11 瀏覽次數(shù):4477
日期:2019-11 瀏覽次數(shù):5026
日期:2019-11 瀏覽次數(shù):10282
日期:2019-11 瀏覽次數(shù):5459
日期:2019-11 瀏覽次數(shù):5437
日期:2019-11 瀏覽次數(shù):4884
日期:2019-11 瀏覽次數(shù):12330
日期:2019-11 瀏覽次數(shù):7354
日期:2019-11 瀏覽次數(shù):7904
日期:2019-11 瀏覽次數(shù):4857
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.