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 继承详解 第一篇
Aug 30 Javascript
jquery实现的下拉和收缩效果示例
Aug 21 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
Oct 21 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
Oct 30 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
Nov 20 Javascript
实例讲解javascript实现异步图片上传方法
Dec 05 Javascript
Vue中"This dependency was not found"问题的解决方法
Jun 19 Javascript
关于js对textarea换行符的处理方法浅析
Aug 03 Javascript
使用Node搭建reactSSR服务端渲染架构
Aug 30 Javascript
js回文数的4种判断方法示例
Jun 04 Javascript
vue+element项目中过滤输入框特殊字符小结
Aug 07 Javascript
梳理一下vue中的生命周期
Dec 30 Vue.js
详解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
一个MYSQL操作类
2006/11/16 PHP
PHP编译安装时常见错误解决办法
2015/05/28 PHP
通过JavaScript使Div居中并随网页大小改变而改变
2013/06/24 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
jQuery搜索子元素的方法
2015/02/10 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
小程序简单两栏瀑布流效果的实现
2019/12/18 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
使用Python生成url短链接的方法
2015/05/04 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
奥地利网上现代灯具和灯饰店:Lampenwelt.at
2018/01/29 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
2014年中班元旦活动方案
2014/02/14 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
个人主要事迹材料
2014/08/26 职场文书
毕业实习计划书
2015/01/16 职场文书
店长岗位职责
2015/02/11 职场文书
老乡会致辞
2015/07/28 职场文书
教学反思怎么写
2016/02/24 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python