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 相关文章推荐
js表格分页实现代码
Sep 18 Javascript
Javascript Jquery 遍历Json的实现代码
Mar 31 Javascript
javascript倒计时功能实现代码
Jun 07 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
Dec 12 Javascript
浅谈Unicode与JavaScript的发展史
Jan 19 Javascript
JavaScript的事件代理和委托实例分析
Mar 25 Javascript
学习使用jQuery表单验证插件和日历插件
Feb 13 Javascript
angular 用拦截器统一处理http请求和响应的方法
Jun 08 Javascript
详解在express站点中使用ejs模板引擎
Sep 21 Javascript
利用Node.js批量抓取高清妹子图片实例教程
Aug 02 Javascript
Vue父子组件传值的一些坑
Sep 16 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
实用函数3
2007/11/08 PHP
php 中英文语言转换类
2011/09/07 PHP
Session保存到数据库的php类分享
2011/10/24 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
PHP registerXPathNamespace()函数讲解
2019/02/03 PHP
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
javascript实现5秒倒计时并跳转功能
2019/06/20 Javascript
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
自荐信的禁忌和要点
2013/10/15 职场文书
求职简历中个人的自我评价
2013/12/25 职场文书
总结表彰大会主持词
2014/03/26 职场文书
学习雷锋倡议书
2014/04/15 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
大学生创业事迹材料
2014/12/30 职场文书
三峡导游词
2015/01/31 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
SpringAop日志找不到方法的处理
2021/06/21 Java/Android