项目中如何使用axios过滤多次重复请求详解

当我们在使用axios发起多次请求时,若存在多个相同的请求,会导致冗余的网络请求,浪费带宽和服务器资源,因此,我们需要一种方法来过滤重复的请求。下面是在项目中如何使用axios过滤多次重复请求的完整攻略。

核心思路

使用axios-middleware拦截所有的请求,将每次请求的url和method做一个唯一标识,然后将这个唯一标识作为缓存中的key,将请求的promise对象存储在以该key为键的缓存中。每次请求前首先根据这个唯一标识判断缓存中是否有相同的请求,如果存在则返回缓存中的promise对象,否则执行正常的axios请求。最后将请求成功的数据传递给下一级拦截器。

详细步骤

  1. 安装axios和axios-middleware
npm install axios axios-middleware --save
  1. 在项目中引入axios和axios-middleware,并添加全局拦截器
import axios from 'axios';
import axiosMiddleware from 'axios-middleware';

axiosMiddleware(axios, {
  interceptors: {
    request: [{
        success: function ({ getState, dispatch, getSourceAction }, config) {
          // 计算请求的唯一标识,将url和method做一个唯一字符串
          const reqKey = `${config.url}_${config.method}`;

          // 判断该请求是否已经缓存了,如果已缓存则直接返回缓存中的promise对象
          if (cache[reqKey]) {
            console.log('cached', reqKey);

            return cache[reqKey];
          }

          // 否则创建一个新的promise,将该promise存储到缓存中,并返回新的promise
          const promise = new Promise((resolve, reject) => {
            axios.request(config)
              .then(res => resolve(res))
              .catch(err => reject(err));
          });
          cache[reqKey] = promise;
          console.log('cache', reqKey);

          return promise;
        },
        error: function ({ getState, dispatch, getSourceAction }, error) {
          return Promise.reject(error);
        }
      }],
    response: [{
        success: function ({ getState, dispatch, getSourceAction }, response) {
          return response;
        },
        error: function ({ getState, dispatch, getSourceAction }, error) {
          return Promise.reject(error);
        }
      }]
  }
})
  1. 在项目中使用带缓存的axios
// 此处是一个获取用户信息的请求,带上了userid作为参数
axios.get(`/api/userinfo/${userid}`).then(data => {
  console.log(data);
});

// 再次发起相同的请求,可以发现这次请求是从缓存中取得的数据
axios.get(`/api/userinfo/${userid}`).then(data => {
  console.log(data);
});

示例说明

下面通过两个简单的例子来演示如何使用axios过滤多次重复请求。

示例一

场景:在页面中有两个按钮,每个按钮点击后都会发起一个相同的网络请求。

// html
<button id="button1">Button1</button>
<button id="button2">Button2</button>

// js
const btn1 = document.querySelector('#button1');
const btn2 = document.querySelector('#button2');

btn1.addEventListener('click', () => {
  axios.get('/api/data').then(res => {
    // 处理数据...
  }).catch(err => {
    console.log(err);
  });
})

btn2.addEventListener('click', () => {
  axios.get('/api/data').then(res => {
    // 处理数据...
  }).catch(err => {
    console.log(err);
  });
})

由于两个按钮点击后都要请求相同的数据,因此会出现重复请求数据的问题。下面使用axios-middleware来解决这个问题。

import axios from 'axios';
import axiosMiddleware from 'axios-middleware';

axiosMiddleware(axios, {
  interceptors: {
    request: [{
        success: function ({ getState, dispatch, getSourceAction }, config) {
          // 计算请求的唯一标识,将url和method做一个唯一字符串
          const reqKey = `${config.url}_${config.method}`;

          // 判断该请求是否已经缓存了,如果已缓存则直接返回缓存中的promise对象
          if (cache[reqKey]) {
            console.log('cached', reqKey);

            return cache[reqKey];
          }

          // 否则创建一个新的promise,将该promise存储到缓存中,并返回新的promise
          const promise = new Promise((resolve, reject) => {
            axios.request(config)
              .then(res => resolve(res))
              .catch(err => reject(err));
          });
          cache[reqKey] = promise;
          console.log('cache', reqKey);

          return promise;
        },
        error: function ({ getState, dispatch, getSourceAction }, error) {
          return Promise.reject(error);
        }
      }],
    response: [{
        success: function ({ getState, dispatch, getSourceAction }, response) {
          return response;
        },
        error: function ({ getState, dispatch, getSourceAction }, error) {
          return Promise.reject(error);
        }
      }]
  }
})

const btn1 = document.querySelector('#button1');
const btn2 = document.querySelector('#button2');

btn1.addEventListener('click', () => {
  axios.get('/api/data').then(res => {
    // 处理数据...
  }).catch(err => {
    console.log(err);
  });
})

btn2.addEventListener('click', () => {
  axios.get('/api/data').then(res => {
    // 处理数据...
  }).catch(err => {
    console.log(err);
  });
})

示例二

场景:在table组件中,每个单元格都需要渲染相同的数据,因此会发起重复网络请求。

// html
<table>
  <tr>
    <td><div id="cell1"></div></td>
    <td><div id="cell2"></div></td>
    <td><div id="cell3"></div></td>
  </tr>
  <tr>
    <td><div id="cell4"></div></td>
    <td><div id="cell5"></div></td>
    <td><div id="cell6"></div></td>
  </tr>
  <tr>
    <td><div id="cell7"></div></td>
    <td><div id="cell8"></div></td>
    <td><div id="cell9"></div></td>
  </tr>
</table>

// js
axios.get('/api/data').then(res => {
  document.querySelector('#cell1').innerHTML = res.data;
  document.querySelector('#cell2').innerHTML = res.data;
  document.querySelector('#cell3').innerHTML = res.data;
  document.querySelector('#cell4').innerHTML = res.data;
  document.querySelector('#cell5').innerHTML = res.data;
  document.querySelector('#cell6').innerHTML = res.data;
  document.querySelector('#cell7').innerHTML = res.data;
  document.querySelector('#cell8').innerHTML = res.data;
  document.querySelector('#cell9').innerHTML = res.data;
}).catch(err => {
  console.log(err);
});

由于在渲染table中的每个单元格时都发起了相同的网络请求,因此会出现重复请求数据的问题。下面使用axios-middleware来解决这个问题。

import axios from 'axios';
import axiosMiddleware from 'axios-middleware';

axiosMiddleware(axios, {
  interceptors: {
    request: [{
        success: function ({ getState, dispatch, getSourceAction }, config) {
          // 计算请求的唯一标识,将url和method做一个唯一字符串
          const reqKey = `${config.url}_${config.method}`;

          // 判断该请求是否已经缓存了,如果已缓存则直接返回缓存中的promise对象
          if (cache[reqKey]) {
            console.log('cached', reqKey);

            return cache[reqKey];
          }

          // 否则创建一个新的promise,将该promise存储到缓存中,并返回新的promise
          const promise = new Promise((resolve, reject) => {
            axios.request(config)
              .then(res => resolve(res))
              .catch(err => reject(err));
          });
          cache[reqKey] = promise;
          console.log('cache', reqKey);

          return promise;
        },
        error: function ({ getState, dispatch, getSourceAction }, error) {
          return Promise.reject(error);
        }
      }],
    response: [{
        success: function ({ getState, dispatch, getSourceAction }, response) {
          return response;
        },
        error: function ({ getState, dispatch, getSourceAction }, error) {
          return Promise.reject(error);
        }
      }]
  }
})

axios.get('/api/data').then(res => {
  document.querySelector('#cell1').innerHTML = res.data;
  document.querySelector('#cell2').innerHTML = res.data;
  document.querySelector('#cell3').innerHTML = res.data;
  document.querySelector('#cell4').innerHTML = res.data;
  document.querySelector('#cell5').innerHTML = res.data;
  document.querySelector('#cell6').innerHTML = res.data;
  document.querySelector('#cell7').innerHTML = res.data;
  document.querySelector('#cell8').innerHTML = res.data;
  document.querySelector('#cell9').innerHTML = res.data;
}).catch(err => {
  console.log(err);
});

通过以上两个例子可以证明,使用axios-middleware可以有效地过滤重复的网络请求,减少浪费的带宽和服务器资源。当多个页面或组件中需要渲染相同数据时,使用axios-middleware来处理网络请求非常方便。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:项目中如何使用axios过滤多次重复请求详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 用VueJS写一个Chrome浏览器插件的实现方法

    当我们要用VueJS编写Chrome浏览器插件时,需要考虑的主要问题是如何将VueJS代码与Chrome插件API集成。下面是实现步骤的完整攻略: 步骤一:创建一个新的Chrome插件 首先,我们需要在Chrome浏览器中创建一个新的Chrome插件项目,可以使用Chrome浏览器扩展程序模板代码来加速开发。这里以一个新标签页替换Chrome默认新标签页为案…

    Vue 2023年5月27日
    00
  • vue 获取视频时长的实例代码

    获取视频时长是一个常见的需求,Vue 作为一个流行的前端框架,提供了一些方便的方式来完成这个任务。本文将介绍如何使用 Vue 获取视频时长的实例代码和操作步骤。 步骤一:设置 HTML5 video 元素 首先,我们需要在页面上添加一个 HTML5 video 标签,用于加载视频。下面是一个简单的示例: <template> <video …

    Vue 2023年5月29日
    00
  • vue实现百度下拉列表交互操作示例

    具体介绍 Vue是一款MVVM(Model-View-ViewModel)框架,它的核心是实现了双向数据绑定和组件化系统。双向绑定可以使数据的修改和视图的更新同步进行,显著提高了开发效率和协作效率;组件化系统可以将页面拆分成多个独立的模块,提高代码重用性,并且允许多人协同开发大型项目。Vue的虚拟DOM机制以及其性能表现也更加优秀,使其与Angular和Re…

    Vue 2023年5月28日
    00
  • vue.js单页面应用实例的简单实现

    下面我将详细讲解如何实现vue.js单页面应用的简单实例。 简介 在前端开发中,单页面应用已经成为了很多人关注的焦点。而Vue.js是一种非常流行的实现单页面应用的JS框架。下面我们就来看一下如何利用Vue.js实现简单的单页面应用。 实现步骤 步骤1:安装Vue.js 首先,我们需要安装Vue.js。可以通过以下两种方式进行安装: CDN:通过引入CDN的…

    Vue 2023年5月27日
    00
  • 利用Promise自定义一个GET请求的函数示例代码

    下面是利用 Promise 自定义一个 GET 请求的函数示例代码的完整攻略。 1. 准备工作 在开始编写代码之前,需要先了解一下使用 Promise 实现异步请求的基本步骤: 创建一个 Promise 对象,并返回它 在 Promise 对象中执行异步操作,并根据操作结果调用 resolve 或 reject 方法 调用 Promise 对象的 then …

    Vue 2023年5月28日
    00
  • vue的插槽原来该这样理解

    当我们在开发Vue组件时,有些情况下需要动态地处理组件内部的内容。Vue提供了插槽( Slot )来解决这个问题。通过使用插槽,我们可以将父组件中的任意内容插入子组件中的指定位置,从而实现一种非常灵活的组件封装和组合方式。 一、插槽的用法和基本原理 1.1 插槽基础使用 插槽的基本原理是以 标签作为承载位置,用于显示父组件中传递过来的内容。 下面是一个例子:…

    Vue 2023年5月29日
    00
  • Vue Element UI + OSS实现上传文件功能

    下面是“Vue Element UI + OSS实现上传文件功能”的完整攻略。 准备工作 1.安装Vue CLI并创建Vue项目。 2.引入Element UI和Aliyun OSS SDK。 <!– index.html –> <!DOCTYPE html> <html lang="en"> &l…

    Vue 2023年5月28日
    00
  • vue插件–仿微信小程序showModel实现模态提示窗功能

    下面是实现“vue插件–仿微信小程序showModel实现模态提示窗功能”的完整攻略: 描述 本攻略旨在帮助开发者使用Vue插件实现模态提示窗功能,效果仿照微信小程序的showModel方法。showModel可以帮助开发者快速实现弹窗的效果,使界面更加友好。 准备工作 在实现该功能之前,需要确保你已经了解了Vue的相关知识,并且已经配置好了Vue环境。 …

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部