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显示选择目录对话框的代码
Nov 10 Javascript
使用jquery+CSS实现控制打印样式
Dec 31 Javascript
jquery日历插件datepicker用法分析
Jan 22 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
Aug 05 Javascript
VUE实现表单元素双向绑定(总结)
Aug 08 Javascript
2种简单的js倒计时方式
Oct 20 Javascript
jQuery中的for循环var与let的区别
Apr 21 jQuery
在vue中高德地图引入和轨迹的绘制的实现
Oct 11 Javascript
微信小程序使用 vant Dialog组件的正确方式
Feb 21 Javascript
js代码实现轮播图
May 04 Javascript
基于VUE实现判断设备是PC还是移动端
Jul 03 Javascript
JavaScript实现网页下拉菜单效果
Nov 20 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中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
经典的解除许多网站无法复制文字的绝招
2006/12/31 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
2019/05/14 Javascript
自定义javascript验证框架示例【附源码下载】
2019/05/31 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
Python标准库之循环器(itertools)介绍
2014/11/25 Python
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
Django自定义认证方式用法示例
2017/06/23 Python
python迭代器常见用法实例分析
2019/11/22 Python
python数据化运营的重要意义
2019/11/25 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
销售人员中英文自荐信
2013/09/22 职场文书
酒店总经理工作职责
2013/12/13 职场文书
教导处工作制度
2014/01/18 职场文书
文艺晚会主持词
2014/03/24 职场文书
大学专科求职信
2014/07/02 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
试用期转正工作总结2015
2015/05/28 职场文书