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 相关文章推荐
将光标定位于输入框最右侧实现代码
Dec 04 Javascript
js换图片效果可进行定时操作
Jun 09 Javascript
JS中产生标识符方式的演变
Jun 12 Javascript
jQuery ajax分页插件实例代码
Jan 27 Javascript
js智能获取浏览器版本UA信息的方法
Aug 08 Javascript
jQuery时间日期三级联动(推荐)
Nov 27 Javascript
vue 2.0封装model组件的方法
Aug 03 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
Nov 12 Javascript
Vue实现滑动拼图验证码功能
Sep 15 Javascript
javascrpt密码强度校验函数详解
Mar 18 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
Feb 07 Javascript
关于JavaScript回调函数的深入理解
Jun 27 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/10/09 PHP
PHP错误提示的关闭方法详解
2013/06/23 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
2017/01/08 Javascript
微信小程序 MD5的方法详解及实例代码
2017/03/10 Javascript
jQuery实现模糊查询的方法分析
2018/05/10 jQuery
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
2019/09/12 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
python文件和目录操作方法大全(含实例)
2014/03/12 Python
Python编程之属性和方法实例详解
2015/05/19 Python
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
Django如何配置mysql数据库
2018/05/04 Python
Python中logging实例讲解
2019/01/17 Python
详解Python 切片语法
2019/06/10 Python
python3实现带多张图片、附件的邮件发送
2019/08/10 Python
Python循环实现n的全排列功能
2019/09/16 Python
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
日本航空官方网站:JAL
2019/06/19 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
网游商务专员求职信
2013/10/15 职场文书
公司寄语大全
2014/04/10 职场文书
golang生成并解析JSON
2022/04/14 Golang