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


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 相关文章推荐
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
Aug 09 Javascript
js改变文章字体大小的实例代码
Nov 27 Javascript
简介JavaScript中valueOf()方法的使用
Jun 05 Javascript
JavaScript数组去重的两种方法推荐
Apr 05 Javascript
JavaScript数据存储 Cookie篇
Jul 02 Javascript
15位和18位身份证JS校验的简单实例
Jul 18 Javascript
Node.js与MySQL交互操作及其注意事项
Oct 05 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
Jan 08 Javascript
JavaScript获取select中text值的方法
Feb 13 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
Feb 19 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
Jan 08 Javascript
angularjs 缓存的使用详解
Mar 19 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
全国FM电台频率大全 - 27 陕西省
2020/03/11 无线电
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
JCalendar 日历控件 v1.0 beta[兼容IE&Firefox] 有文档和例子
2007/05/30 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
JS动态加载当前时间的方法
2015/02/09 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
javascript删除数组重复元素的方法汇总
2015/06/24 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
scrapy爬虫完整实例
2018/01/25 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
详解HTML5中的manifest缓存使用
2015/09/09 HTML / CSS
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
缴纳养老保险的证明
2014/01/10 职场文书
新书发布会策划方案
2014/06/09 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
2015年党总支工作总结
2015/05/25 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
九年级数学教学反思
2016/02/17 职场文书
教学反思怎么写
2016/02/24 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
Golang生成Excel文档的方法步骤
2021/06/09 Golang