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


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 设置文本框中焦点的位置
Nov 20 Javascript
JS Date函数整理方便使用
Oct 23 Javascript
JS遍历页面所有对象属性及实现方法
Aug 01 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
Oct 11 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
May 09 Javascript
npm国内镜像 安装失败的几种解决方案
Jun 04 Javascript
AngularJS实现的输入框字数限制提醒功能示例
Oct 26 Javascript
js实现点击展开隐藏效果(实例代码)
Sep 28 Javascript
vue-next/runtime-core 源码阅读指南详解
Oct 25 Javascript
vue之组件内监控$store中定义变量的变化详解
Nov 08 Javascript
jquery实现轮播图特效
Apr 12 jQuery
javascript设计模式 ? 策略模式原理与用法实例分析
Apr 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学习之PHP变量
2006/10/09 PHP
Session保存到数据库的php类分享
2011/10/24 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
php实现短信发送代码
2015/07/05 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
Jquery实现遮罩层的方法
2015/06/08 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
Python中isnumeric()方法的使用简介
2015/05/19 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
Python集合基本概念与相关操作实例分析
2019/10/30 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
CSS3属性选择符介绍
2008/10/17 HTML / CSS
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
GoDaddy英国:全球排名第一的域名注册商
2018/06/08 全球购物
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
介绍一下#error预处理
2015/09/25 面试题
2014年幼儿园园长工作总结
2014/12/17 职场文书
学校捐款活动总结
2015/05/09 职场文书
Golang实现AES对称加密的过程详解
2021/05/20 Golang
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
MySQL中一条update语句是如何执行的
2022/03/16 MySQL