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


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 表单规则集合对象
Jul 21 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
Mar 03 Javascript
按下Enter焦点移至下一个控件的实现js代码
Dec 11 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
Sep 24 Javascript
JavaScript中文件上传API详解
Apr 01 Javascript
使用JavaScript实现ajax的实例代码
May 11 Javascript
jQuery遍历节点树方法分析
Sep 08 Javascript
JavaScript实现省市县三级级联特效
May 16 Javascript
Node层模拟实现multipart表单的文件上传示例
Jan 02 Javascript
原生JavaScript实现的简单放大镜效果示例
Feb 07 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
Nov 24 Javascript
vue引入Excel表格插件的方法
Apr 28 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
php 静态化实现代码
2009/03/20 PHP
PHP 处理图片的类实现代码
2009/10/23 PHP
php网站被挂木马后的修复方法总结
2014/11/06 PHP
php基于curl重写file_get_contents函数实例
2016/11/08 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
javascript 关闭IE6、IE7
2009/06/01 Javascript
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
JS 页面计时器示例代码
2013/10/28 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Python中的日期时间处理详解
2016/11/17 Python
Python 基础教程之闭包的使用方法
2017/09/29 Python
python安装numpy和pandas的方法步骤
2019/05/27 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
Python八皇后问题解答过程详解
2019/07/29 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
致标枪运动员加油稿
2014/02/15 职场文书
小班上学期评语
2014/05/05 职场文书
第二课堂活动总结
2014/05/07 职场文书
商场租赁意向书
2014/07/30 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
《开国大典》教学反思
2016/02/16 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
Java无向树分析 实现最小高度树
2022/04/09 Javascript
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS