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 相关文章推荐
短信提示使用 特效
Jan 19 Javascript
Mootools 1.2教程 滚动条(Slider)
Sep 15 Javascript
JQuery的Ajax跨域请求原理概述及实例
Apr 26 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
Nov 25 Javascript
js确认删除对话框效果的示例代码
Feb 20 Javascript
javascript常见用法总结
May 22 Javascript
30个经典的jQuery代码开发技巧
Dec 15 Javascript
php基于redis处理session的方法
Mar 14 Javascript
微信小程序 video组件详解
Oct 25 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
Nov 09 Javascript
微信小程序App生命周期详解
Jan 31 Javascript
vue百度地图 + 定位的详解
May 13 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
动态生成gif格式的图像要注意?
2006/10/09 PHP
一个数据采集类
2007/02/14 PHP
php模板之Phpbean的目录结构
2008/01/10 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
JavaScript 学习历程和心得分享
2010/12/12 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
Mint UI实现A-Z字母排序的城市选择列表
2018/12/28 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
Python注释详解
2016/06/01 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
浅谈python之新式类
2018/08/12 Python
Python爬虫爬取杭州24时温度并展示操作示例
2020/03/27 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
用Python实现职工信息管理系统
2020/12/30 Python
Sperry官网:帆船鞋创始品牌
2016/09/07 全球购物
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
时尚休闲吧创业计划书
2014/01/25 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
小班评语大全
2014/05/04 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
药店收银员岗位职责
2015/04/07 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
2015年卫生院健康教育工作总结
2015/07/24 职场文书
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL