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


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 相关文章推荐
jquery 学习之一 对象访问
Nov 23 Javascript
jQuery 选择器、DOM操作、事件、动画
Nov 25 Javascript
jquery()函数的三种语法介绍
Oct 09 Javascript
Jquery.Form 异步提交表单的简单实例
Mar 03 Javascript
js换图片效果可进行定时操作
Jun 09 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
Dec 14 Javascript
JS实现的4种数字千位符格式化方法分享
Mar 02 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
Sep 25 Javascript
原生JS实现首页进度加载动画
Sep 14 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
Aug 24 Javascript
angular ng-model 无法获取值的处理方法
Oct 02 Javascript
解决Vue中使用keepAlive不缓存问题
Aug 04 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
php中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
PHP5.3新特性小结
2016/02/14 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
JavaScript入门学习书籍推荐
2008/06/12 Javascript
Javascript 面向对象 重载
2010/05/13 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
在JavaScript里防止事件函数高频触发和高频调用的方法
2014/09/06 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
浅谈javascript中的 “ && ” 和 “ || ”
2017/02/02 Javascript
Node+Express+MongoDB实现登录注册功能实例
2017/04/23 Javascript
详解Vue 开发模式下跨域问题
2017/06/06 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
python中list列表的高级函数
2016/05/17 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
Python开发的十个小贴士和技巧及长常犯错误
2018/09/27 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
树莓派安装OpenCV3完整过程的实现
2019/10/10 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
香港通票:Hong Kong Pass
2019/02/26 全球购物
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
.net开发工程师面试题
2014/02/25 面试题
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
先进集体申报材料
2014/12/25 职场文书
教师党员个人自我评价
2015/03/04 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
教师外出学习心得体会
2016/01/18 职场文书
SSM VUE Axios详解
2021/10/05 Vue.js
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS
使用Mysql计算地址的经纬度距离和实时位置信息
2022/04/29 MySQL
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android