javascript实现fetch请求返回的统一拦截


Posted in Javascript onDecember 22, 2019

拦截器的目的

拦截器(interceptors)一般用于发起 http 请求之前或之后对请求进行统一的处理,
如 token 实现的登录鉴权(每个请求带上 token),统一处理 404 响应等等。

之前的实现

区别于 axios,fetch 没有搜到请求返回拦截器相关 api,那之前是怎么实现统一拦截的呢,
参照 antd-pro,写一个统一的请求方法,所有的请求都调用这个方法,从而实现请求与返回的拦截。
这样我们每次都要去引入这个方法使用,那么有没有更好实现呢?

常见的一道面试题

vue 双向绑定的原理

  • vue2 基于 defineProperty
  • vue3 基于 Proxy

极简的双向绑定

const obj = {};
Object.defineProperty(obj, 'text', {
 get: function() {
  console.log('get val'); 
 },
 set: function(newVal) {
  console.log('set val:' + newVal);
  document.getElementById('input').value = newVal;
  document.getElementById('span').innerHTML = newVal;
 }
});

const input = document.getElementById('input');
input.addEventListener('keyup', function(e){
 obj.text = e.target.value;
})

其中我们可以看到运用了看数据劫持。

defineProperty

查看 MDN

我们可以发现 defineProperty 的使用方法

Object.defineProperty(obj, prop, descriptor);

descriptor 属性与方法包含

value
属性的值(不用多说了)

configurable: true,
总开关,一旦为 false,就不能再设置他的(value,writable,configurable)

enumerable: true,
是否能在 for...in 循环中遍历出来或在 Object.keys 中列举出来。

writable: true,
如果为 false,属性的值就不能被重写,只能为只读了

set()
设置属性时候会调用

get()
访问属性时候会调用

回想下我们使用 fetch 的时候都是直接使用,所以 fetch 是 window 或者 global 对象下的一个属性啊,
每次我们使用 fetch 的时候相当于访问了 window 或者 global 的属性,也就是上面的 get 方法

拦截器的实现

const originFetch = fetch;
Object.defineProperty(window, "fetch", {
 configurable: true,
 enumerable: true,
 // writable: true,
 get() {
  return (url,options) => {
   return originFetch(url,{...options,...{
    headers: {
     'Content-Type': 'application/json;charset=UTF-8',
     Accept: 'application/json',
     token:localStorage.getItem('token') 
     //这里统一加token 实现请求拦截
    },...options.headers
   }}).then(checkStatus) 
   // checkStatus 这里可以做返回错误处理,实现返回拦截
  .then(response =>response.json())
 }
});

只要将上述代码贴到程序入口文件即可

扩展

此文是基于 defineProperty , Proxy 同样可以实现。

另外在小程序里面 request 方法是挂在 wx 下面,同样是可以实现,

具体实现 wx.request

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js工具方法弹出蒙版
May 08 Javascript
JS字符串拼接在ie中都报错的解决方法
Mar 27 Javascript
jQuery实现的一个自定义Placeholder属性插件
Aug 11 Javascript
javascript实现修改微信分享的标题内容等
Dec 11 Javascript
浅析JavaScript作用域链、执行上下文与闭包
Feb 01 Javascript
JS判断日期格式是否合法的简单实例
Jul 11 Javascript
使用jsonp实现跨域获取数据实例讲解
Dec 25 Javascript
JavaScript中捕获与冒泡详解及实例
Feb 03 Javascript
VueRouter导航守卫用法详解
Dec 25 Javascript
使用puppeteer破解极验的滑动验证码
Feb 24 Javascript
Vue中keep-alive 实现后退不刷新并保持滚动位置
Mar 17 Javascript
Vue使用Three.js加载glTF模型的方法详解
Jun 14 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
Dec 22 #Javascript
判断JavaScript中的两个变量是否相等的操作符
Dec 21 #Javascript
javascript中的相等操作符(==与===区别)
Dec 21 #Javascript
JavaScript中的相等操作符使用详解
Dec 21 #Javascript
高性能js数组去重(12种方法,史上最全)
Dec 21 #Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
Dec 21 #Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
Dec 20 #Javascript
You might like
PHP自定义函数收代码
2010/08/01 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
js验证表单大全
2006/11/25 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
输入框过滤非数字的js代码
2014/09/18 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
js实现仿购物车加减效果
2017/03/01 Javascript
微信小程序网络请求的封装与填坑之路
2017/04/01 Javascript
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
vue 登录滑动验证实现代码
2018/08/24 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
在Django的URLconf中使用命名组的方法
2015/07/18 Python
python类中super()和__init__()的区别
2016/10/18 Python
Python实现登录接口的示例代码
2017/07/21 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
详解python列表(list)的使用技巧及高级操作
2019/08/15 Python
python如何从文件读取数据及解析
2019/09/19 Python
python3 配置logging日志类的操作
2020/04/08 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
全球度假村:Club Med
2017/11/27 全球购物
客户经理岗位职责
2013/12/08 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
助理政工师申报材料
2014/06/03 职场文书
物业公司的岗位任命书
2014/06/06 职场文书
商务经理岗位职责
2014/07/30 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
西岭雪山导游词
2015/02/06 职场文书
2015年工商所工作总结
2015/05/21 职场文书
pycharm debug 断点调试心得分享
2021/04/16 Python