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中出现乱码的处理心得
Dec 24 Javascript
jQuery创建自己的插件(自定义插件)的方法
Jun 10 Javascript
js中if语句的几种优化代码写法
Mar 12 Javascript
Jquery 数据选择插件Pickerbox使用介绍
Aug 24 Javascript
浅析JS中document对象的一些重要属性
Mar 06 Javascript
Bootstrap select实现下拉框多选效果
Dec 23 Javascript
简单实现js菜单栏切换效果
Mar 04 Javascript
基于zepto.js实现手机相册功能
Jul 11 Javascript
JavaScript实现百度搜索框效果
Mar 26 Javascript
Electron中实现大文件上传和断点续传功能
Oct 28 Javascript
node.js爬虫框架node-crawler初体验
Oct 29 Javascript
js制作提示框插件
Dec 24 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
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
JS实现简单的图书馆享元模式实例
2015/06/30 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
2016/08/25 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
js Canvas绘制圆形时钟教程
2017/02/06 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
详解js类型判断
2018/05/22 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
Python 用__new__方法实现单例的操作
2020/12/11 Python
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
高中运动会入场词
2014/02/14 职场文书
歌颂党的演讲稿
2014/09/10 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
详解nginx进程锁的实现
2021/06/14 Servers