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 相关文章推荐
Jquery数独游戏解析(一)-页面布局
Nov 05 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
Nov 26 Javascript
jQuery中wrapAll()方法用法实例
Jan 16 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
Feb 24 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
Apr 20 Javascript
js获取客户端操作系统类型的方法【测试可用】
May 27 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
Aug 01 Javascript
webpack4的迁移的使用方法
May 25 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
Oct 19 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 Javascript
Vue自动构建发布脚本的方法示例
Jul 24 Javascript
JS数组去重详情
Nov 07 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编程中八种常见的文件操作方式
2006/11/19 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
MyEclipse常用配置图文教程
2014/09/11 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
用javascript关闭本窗口不弹出询问框的方法
2014/09/12 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
JS实现在状态栏显示打字效果完整实例
2015/11/02 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
python自动发邮件总结及实例说明【推荐】
2019/05/31 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
Python实现EXCEL表格的排序功能示例
2019/06/25 Python
python 实现按对象传值
2019/12/26 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
Html5新增标签有哪些
2017/04/13 HTML / CSS
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
应届大学生求职的自我评价
2013/11/17 职场文书
国贸专业个人求职信分享
2013/12/04 职场文书
四年级语文教学反思
2014/02/05 职场文书
珍惜水资源建议书
2014/03/12 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
学习保证书
2015/01/17 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
导游词之山东红叶谷
2019/10/31 职场文书
Python实现简繁体转换
2021/06/07 Python
Go遍历struct,map,slice的实现
2021/06/13 Golang
SpringBoot整合Minio文件存储
2022/04/03 Java/Android
海弦WR-800F
2022/04/05 无线电