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


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 相关文章推荐
javascript 框架小结 个人工作经验
Jun 13 Javascript
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
Apr 15 Javascript
JavaScript中使用replace结合正则实现replaceAll的效果
Jun 04 Javascript
基于Jquery的文字自动截取(提供源代码)
Aug 09 Javascript
Javascript insertAfter() 实现函数代码
Oct 12 Javascript
Javascript根据指定下标或对象删除数组元素
Dec 21 Javascript
JQuery日期插件datepicker的使用方法
Mar 03 Javascript
JS实现简单的右下角弹出提示窗口完整实例
Jun 21 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
Apr 27 jQuery
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 Javascript
带你使用webpack快速构建web项目的方法
Nov 12 Javascript
原生JS实现京东查看商品点击放大
Dec 21 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获得当前的脚本网址
2007/12/10 PHP
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
js更优雅的兼容
2010/08/12 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
Vue请求JSON Server服务器数据的实现方法
2018/11/02 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
Python控制键盘鼠标pynput的详细用法
2019/01/28 Python
Django实现学员管理系统
2019/02/26 Python
Pygame的程序开始示例代码
2020/05/07 Python
Python sorted对list和dict排序
2020/06/09 Python
Python xlwt模块使用代码实例
2020/06/10 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
TripAdvisor台湾:全球最大旅游网站
2018/08/26 全球购物
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
汽修专业学生自我鉴定
2013/11/16 职场文书
国际会计专业求职信
2014/08/04 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
暑期培训班策划方案
2014/08/26 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
党员个人承诺书
2015/04/27 职场文书
钱学森观后感
2015/06/04 职场文书
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript