小程序如何自主实现拦截器的示例代码


Posted in Javascript onNovember 04, 2019

在一些框架中发现会提供一个很实用的功能:拦截器(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,尽量以大家最为熟悉的方式书写代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中浮点型运算BUG的解决方法说明
Jan 06 Javascript
avascript中的自执行匿名函数应用示例
Sep 15 Javascript
JavaScript中的ArrayBuffer详细介绍
Dec 08 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
Jun 24 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
May 15 Javascript
javascript之Array 数组对象详解
Jun 07 Javascript
Bootstrap3 datetimepicker控件使用实例
Dec 13 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
Jan 19 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
Aug 19 Javascript
微信小程序调用摄像头隐藏式拍照功能
Aug 22 Javascript
layui操作列按钮个数和文字颜色的判断实例
Sep 11 Javascript
Vue实现兄弟组件间的联动效果
Jan 21 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
Nov 04 #Javascript
JavaScript判断浏览器版本的方法
Nov 03 #Javascript
JavaScript算法学习之冒泡排序和选择排序
Nov 02 #Javascript
如何正确理解vue中的key详解
Nov 02 #Javascript
Javascript 关于基本类型和引用类型的个人理解
Nov 01 #Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
Nov 01 #Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
Nov 01 #Javascript
You might like
php中static静态变量的使用方法详解
2010/06/04 PHP
深入php多态的实现详解
2013/06/09 PHP
php调用新浪短链接API的方法
2014/11/08 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
python ElementTree 基本读操作示例
2009/04/09 Python
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
浅析Python中的join()方法的使用
2015/05/19 Python
Python执行时间的计算方法小结
2017/03/17 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
Numpy中转置transpose、T和swapaxes的实例讲解
2018/04/17 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
经济国贸专业求职信
2014/06/18 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书