javascript实现fetch请求返回的统一拦截

 更新时间:2019年12月22日 09:29:14   作者:现在是冬天  
这篇文章主要介绍了javascript实现fetch请求返回的统一拦截,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

拦截器的目的

拦截器(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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JS复制到剪贴板示例代码

    JS复制到剪贴板示例代码

    复制到剪贴板的实现方法有很多,在本文将为大家详细介绍下使用js是如何实现的,感兴趣的朋友不要错过
    2013-10-10
  • JavaScript canvas实现带有阴影的图形和文字

    JavaScript canvas实现带有阴影的图形和文字

    这篇文章主要为大家详细介绍了JavaScript canvas实现带有阴影的图形和文字,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • 前端实现批量下载并打包成ZIP文件的步骤及示例

    前端实现批量下载并打包成ZIP文件的步骤及示例

    下载我相信很多小伙伴并不陌生,下载文件的形式也有很多,下面这篇文章主要给大家介绍了关于前端实现批量下载并打包成ZIP文件的步骤及示例,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • JS实现淘宝支付宝网站的控制台菜单效果

    JS实现淘宝支付宝网站的控制台菜单效果

    这篇文章主要介绍了JS实现淘宝支付宝网站的控制台菜单效果,涉及JavaScript基于时间函数及数学运算控制页面动画弹出菜单效果的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • JavaScript ES6 Class类实现原理详解

    JavaScript ES6 Class类实现原理详解

    这篇文章主要介绍了JavaScript ES6 Class类实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • javascript使用window.name解决跨域问题

    javascript使用window.name解决跨域问题

    window.name 的美妙之处:name 值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。
    2008-09-09
  • Javascript实现时间倒计时功能

    Javascript实现时间倒计时功能

    这篇文章主要为大家详细介绍了Javascript实现时间倒计时功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • js实现鼠标拖动功能

    js实现鼠标拖动功能

    本文主要介绍了js实现鼠标拖动功能的实例代码。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • JavaScript中的冒泡排序法

    JavaScript中的冒泡排序法

    这篇文章主要介绍了JavaScript中的冒泡排序法的知识,并通过一个例子给大家讲解了js冒泡排序,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-08-08
  • uniapp实现人脸识别功能的具体实现代码

    uniapp实现人脸识别功能的具体实现代码

    最近在使用uniapp开发项目,有刷脸实名认证的需求,下面这篇文章主要给大家介绍了关于uniapp实现人脸识别功能的具体实现,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12

最新评论