Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

How to handle the reuse of AJAX requests in front-end development

2025-01-18 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >

Share

Shulou(Shulou.com)06/03 Report--

这篇文章给大家分享的是有关前端开发中怎么处理AJAX请求的重复使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

在开发前端时,我们经常使用AJAX来初始化数据并动态渲染在页面上,但是在遇到一连串的相同数据都要进行请求时,就有可能对同一个API 发出并发请求,然而,因为这些请求是同时发出,因此响应也非常可能是相同的,这样讲可能不够清楚,直接写一个简易的范例来解释这个情况。

实际范例

首先我们先撰写一个API:

https://localhost:3000/api/v1/users/:uuid

这个API的回传值如下:

{ "name":"Username{uuid}", "uuid":"{uuid}" }

随后开一个Vue的demo,并且先通过Axios写一个请求的函数:

// fetch-user.js const axios = require('axios'); module.exports = (uuid) => { let uri = `http://localhost:3000/users/${uuid}`; return new Promise(resolve => { axios.get(uri).then(resolve); }) };

然后我们在Vue例子中新增一个User Component(User.vue)来负责渲染并请求接口:

{{user.name}} {{user.uuid}} const fetchUser = require('../lib/fetch-user'); export default { name: 'User', data: function() { return { init: false, user: null } }, props: { uuid: String }, async mounted() { const response = await fetchUser(this.uuid); this.init = true; this.user = response.data; } }

最后将用户组件放入App.vue中:

import User from './components/User'; export default { name: 'App', components: { User } }

接着我们看一下显示结果:

这样就正确显示了,然而这里有一个问题非常值得注意:

我们打开开发者模式就会发现,每个组件向该API发出了请求,因此就产生了10次的并发请求,但是在这种情况下,实际上我们仅需要让一个请求出去,另外9个元件等待这个请求的响应然后重新使用即可。

改进的方法

接下来将讲解要如何实现关于在同一个组件之间唯一指定API请求一次并分配请求,我们会用到这个元件EventTarget,这个元件有点类似Node.js中的EventEmitter,主要就是用于接收事件。

随后我们改写fetchUser()函数:

const axios = require('axios'); /** * 这个 class 是用于存储 Response Data 的 Event 衍生类 */ class FetchCompleteEvent extends Event { constructor(type, data) { super(type); this.data = data; } } // 用于请求成功时使用的事件监听器 const eventEmitter = new EventTarget(); // 用于请求失败时使用的事件监听器 const errorEmitter = new EventTarget(); /** * 用于存储 URI 以及是否当前正在请求的状态,如: * http://localhost:8000/users/foo => true 代表已经发出请求,正在等待 Response * http://localhost:8000/users/bar => false 代表当前没有请求在路上 */ const requestingList = new Map(); module.exports = (uuid) => { let uri = `http://localhost:3000/users/${uuid}`; return new Promise((resolve, reject) => { // 如果没有记录,或者尚未处于请求状态 if (!requestingList.has(uri) || !requestingList.get(uri)) { // 进入之后立即将请求状态设为 true requestingList.set(uri, true); // 请求 URI axios.get(uri).then(response => { // 完成请求之后将请求状态设为 false requestingList.set(uri, false); // 发出一个事件通知来告诉 callback 请求完成了 eventEmitter.dispatchEvent(new FetchCompleteEvent(uri, response)); resolve(response); }).catch((e) => { // 请求失败也算是请求完成,将请求状态设为 false requestingList.set(uri, false); // 发出一个事件通知来告诉 callback 请求失败了 errorEmitter.dispatchEvent(new FetchCompleteEvent(uri, e)); reject(e); }) } // 当目前指定的 URL 处于请求状态,则不做任何事情 else { // 向成功的事件监听器注册,当完成之后 resolve() eventEmitter.addEventListener(uri, (event) => { resolve(event.data); }); // 失败之后 reject() errorEmitter.addEventListener(uri, (event) => { reject(event.data); }) } }); };

接着我们重新运行前端应用程序并查看结果:

结果与一开始一模一样,而是当时我们打开开发者模式就会发现:

请求已经被减少到剩下一个了,这是因为所有的元件都重复使用了一个同一个响应。通过这种方法将可以大大减少服务器的负载以及前端的运行时间。

感谢各位的阅读!关于"前端开发中怎么处理AJAX请求的重复使用"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Development

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report