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 相关文章推荐
jQuery 渐变下拉菜单
Dec 15 Javascript
关于event.cancelBubble和event.stopPropagation()的区别介绍
Dec 11 Javascript
js正文内容高亮效果的实现方法
Jun 30 Javascript
文本框只能选择数据到文本框禁止手动输入
Nov 22 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
Nov 28 Javascript
jQuery中contents()方法用法实例
Jan 08 Javascript
javascript结合CSS实现苹果开关按钮特效
Apr 07 Javascript
JQuery实现简单的服务器轮询效果实例
Mar 31 Javascript
详解vue之页面缓存问题(基于2.0)
Jan 10 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
Jun 24 Javascript
Postman参数化实现过程及原理解析
Aug 13 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
Nov 12 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语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
Javascript实例教程(19) 使用HoTMetal(2)
2006/12/23 Javascript
JQery 渐变图片导航效果代码 漂亮
2010/01/01 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
node.js下when.js 的异步编程实践
2014/12/03 Javascript
JavaScript制作windows经典扫雷小游戏
2015/03/31 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
Jquery获取radio选中值实例总结
2019/01/17 jQuery
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
pytorch中图像的数据格式实例
2020/02/11 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
生物科学专业个人求职信范文
2013/12/07 职场文书
给老师的检讨书
2014/02/11 职场文书
三字经教学反思
2014/04/26 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
部门优秀员工推荐信
2015/03/24 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript
SSM VUE Axios详解
2021/10/05 Vue.js
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js
Python之matplotlib绘制折线图
2022/04/13 Python