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


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教学之性能优化
May 14 Javascript
jQuery插件datalist实现很好看的input下拉列表
Jul 14 Javascript
jQuery实现简单的列表式导航菜单效果代码
Aug 31 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
Dec 25 Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 Javascript
JavaScript数据结构与算法之栈与队列
Jan 29 Javascript
分类解析jQuery选择器
Nov 23 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
Feb 10 Javascript
前后端如何实现登录token拦截校验详解
Sep 03 Javascript
使用rollup打包JS的方法步骤
Dec 05 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
Dec 21 Javascript
js实现金山打字通小游戏
Jul 24 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 八种基本的数据类型小结
2011/06/01 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
JS路由跳转的简单实现代码
2017/09/21 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
vue+vue-router转场动画的实例代码
2018/09/01 Javascript
PyQt5每天必学之单行文本框
2018/04/19 Python
Python短信轰炸的代码
2020/03/25 Python
python如何编写win程序
2020/06/08 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
2020/07/13 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
经济职业学院毕业生自荐书
2014/03/17 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
党支部换届选举方案
2014/05/08 职场文书
大学生个人求职信
2014/06/02 职场文书
建筑学专业自荐书
2014/07/09 职场文书
2014年维修工作总结
2014/11/22 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
环卫工人慰问信
2015/02/15 职场文书
婚育证明样本
2015/06/16 职场文书
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS