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 相关文章推荐
转义字符(\)对JavaScript中JSON.parse的影响概述
Jul 17 Javascript
JavaScript及jquey实现多个数组的合并操作
Sep 06 Javascript
2014年50个程序员最适用的免费JQuery插件
Dec 15 Javascript
JavaScript实现简单图片翻转的方法
Apr 17 Javascript
js精准的倒计时函数分享
Jun 29 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
Aug 24 Javascript
jQuery实现拖动剪裁图片作为头像
Dec 28 Javascript
js中的reduce()函数讲解
Jan 18 Javascript
js console.log打印对象时属性缺失的解决方法
May 23 Javascript
Vue项目总结之webpack常规打包优化方案
Jun 06 Javascript
vue路由传参页面刷新参数丢失问题解决方案
Oct 08 Javascript
JavaScript缺少insertAfter解决方案
Jul 03 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 include的妙用,实现路径加密
2008/07/29 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
2019/03/18 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
python在linux中输出带颜色的文字的方法
2014/06/19 Python
python设置值及NaN值处理方法
2018/07/03 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
pandas 将索引值相加的方法
2018/11/15 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
python for 循环获取index索引的方法
2019/02/01 Python
Python Pandas 箱线图的实现
2019/07/23 Python
python函数的作用域及关键字详解
2019/08/20 Python
Python魔法方法 容器部方法详解
2020/01/02 Python
python实现飞船游戏的纵向移动
2020/04/24 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
浅谈HTML5 FileReader分布读取文件以及其方法简介
2017/11/09 HTML / CSS
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
COSETTE官网:奢华,每天
2020/03/22 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
企划主管岗位职责
2013/12/12 职场文书
网站推广策划方案
2014/06/04 职场文书
财务务虚会发言材料
2014/10/20 职场文书
手术室护士个人总结
2015/02/13 职场文书
2015年先进个人自荐书
2015/03/24 职场文书