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 中document.URL 和 windows.location.href 的区别
Nov 11 Javascript
jquery 的 $("#id").html() 无内容的解决方法
Jun 07 Javascript
JavaScript的类型转换(字符转数字 数字转字符)
Aug 30 Javascript
AlertBox 弹出层信息提示框效果实现步骤
Oct 11 Javascript
js实现jquery的offset()方法实例
Jan 10 Javascript
jQuery 跨域访问解决原理案例详解
Jul 09 Javascript
js放到head中失效的原因与解决方法
Mar 07 Javascript
浅谈JavaScript正则表达式-非捕获性分组
Mar 08 Javascript
js处理包含中文的字符串实例
Oct 11 Javascript
JavaScript基础心法 数据类型
Mar 05 Javascript
Puppeteer环境搭建的详细步骤
Sep 21 Javascript
JS实现提示框跟随鼠标移动
Aug 27 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 类型转换函数intval
2009/06/20 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
php四种定界符详解
2017/02/16 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
索趣科技的答案
2007/02/07 Javascript
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
对Python函数设计规范详解
2019/07/19 Python
Python3 批量扫描端口的例子
2019/07/25 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
python3.6使用SMTP协议发送邮件
2020/05/20 Python
Python创建文件夹与文件的快捷方法
2020/12/08 Python
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
自我评价200字分享
2013/12/17 职场文书
关于元旦的广播稿
2014/02/16 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
老干部座谈会主持词
2015/07/03 职场文书