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


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 相关文章推荐
NiftyCube——轻松实现圆角边框
Feb 20 Javascript
js取得url地址参数实例
Feb 22 Javascript
javascript操作css属性
Dec 30 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
Jun 23 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
Feb 26 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
Jun 10 Javascript
javascript字符串循环匹配实例分析
Jul 17 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
Aug 28 Javascript
纯js三维数组实现三级联动效果
Feb 07 Javascript
写gulp遇到的ES6问题详解
Dec 03 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
Sep 09 Javascript
关于Vue Router的10条高级技巧总结
May 06 Vue.js
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
如何给phpadmin一个保护
2006/10/09 PHP
php 传值赋值与引用赋值的区别
2010/12/29 PHP
解析isset与is_null的区别
2013/08/09 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
React应用中使用Bootstrap的方法
2017/08/15 Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
Python实现截屏的函数
2015/07/25 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
Python实现Event回调机制的方法
2019/02/13 Python
基于python操作ES实例详解
2019/11/16 Python
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
介绍一下grep命令的使用
2012/06/28 面试题
应届毕业生就业自荐信
2013/10/26 职场文书
研究生毕业鉴定
2014/01/29 职场文书
实习生求职自荐信
2014/02/07 职场文书
青春无悔演讲稿
2014/05/08 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
法人代表证明书格式
2014/10/01 职场文书
逃课检讨书范文
2015/05/06 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫