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 相关文章推荐
总结AJAX相关JS代码片段和浏览器模型
Aug 15 Javascript
jQuery1.6 使用方法一
Nov 23 Javascript
文档对象模型DOM通俗讲解
Nov 01 Javascript
D3.js 从P元素的创建开始(显示可加载数据)
Oct 30 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
Sep 18 Javascript
AngularJS中$apply方法和$watch方法用法总结
Dec 13 Javascript
React 组件间的通信示例
Jun 14 Javascript
Angularjs实现数组随机排序的方法
Oct 02 Javascript
详解VUE调用本地json的使用方法
May 15 Javascript
node+multer实现图片上传的示例代码
Feb 18 Javascript
微信小程序实现手指拖动选项排序
Apr 22 Javascript
如何通过JS实现日历简单算法
Oct 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
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
php小偷相关截取函数备忘
2010/11/28 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
javascript开发中因空格引发的错误
2010/11/08 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
JS实现拖拽元素时与另一元素碰撞检测
2020/08/27 Javascript
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
python pyheatmap包绘制热力图
2018/11/09 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
Python设计模式之建造者模式实例详解
2019/01/17 Python
python读取大文件越来越慢的原因与解决
2019/08/08 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
jupyter notebook清除输出方式
2020/04/10 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
幼儿园大班新学期寄语
2014/01/18 职场文书
优良学风班申请材料
2014/02/13 职场文书
《鱼游到了纸上》教学反思
2014/02/20 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
人民检察院起诉书
2015/05/20 职场文书
2019同学聚会主持词
2019/05/06 职场文书
Node实现搜索框进行模糊查询
2021/06/28 Javascript
浅谈redis整数集为什么不能降级
2021/07/25 Redis