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


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 1.3.2 IE8中的一点点的小问题解决方法
Jul 10 Javascript
javascript转换字符串为dom对象(字符串动态创建dom)
May 10 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
Sep 02 Javascript
jquery禁用右键单击功能屏蔽F5刷新
Mar 17 Javascript
推荐一个封装好的getElementsByClassName方法
Dec 02 Javascript
Javascript中prototype的使用详解
Jun 18 Javascript
AngularJS中的promise用法分析
May 19 Javascript
js 发布订阅模式的实例讲解
Sep 10 Javascript
JS常见构造模式实例对比分析
Aug 27 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
Jan 25 Javascript
利用Promise自定义一个GET请求的函数示例代码
Mar 20 Javascript
JavaScript实现单英文金山打字通
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 visitFile()遍历指定文件夹函数
2010/08/21 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
python回溯法实现数组全排列输出实例分析
2015/03/17 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
基于python 爬虫爬到含空格的url的处理方法
2018/05/11 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
2019/08/23 Python
python [:3] 实现提取数组中的数
2019/11/27 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
python退出循环的方法
2020/06/18 Python
用pushplus+python监控亚马逊到货动态推送微信
2021/01/29 Python
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
酒店副总岗位职责
2013/12/24 职场文书
社会实践的活动方案
2014/08/22 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
2014办公室年度工作总结
2014/12/09 职场文书
2019年最新版见习人员管理制度!
2019/07/08 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技