中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

前端開發中怎么處理AJAX請求的重復使用

發布時間:2021-09-06 15:06:22 來源:億速云 閱讀:169 作者:小新 欄目:web開發

這篇文章給大家分享的是有關前端開發中怎么處理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)來負責渲染并請求接口:

<template>     <div v-if="init">         <ul>             <li>{{user.name}}</li>             <li>{{user.uuid}}</li>         </ul>     </div> </template>  <script>     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;         }     } </script>

最后將用戶組件放入App.vue中:

<template>     <div id="app">         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>         <user uuid="user-uuid"></user>     </div> </template>  <script> import User from './components/User';  export default {     name: 'App',     components: {         User     } } </script>

接著我們看一下顯示結果:

前端開發中怎么處理AJAX請求的重復使用

這樣就正確顯示了,然而這里有一個問題非常值得注意:

前端開發中怎么處理AJAX請求的重復使用

我們打開開發者模式就會發現,每個組件向該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請求的重復使用

結果與一開始一模一樣,而是當時我們打開開發者模式就會發現:

前端開發中怎么處理AJAX請求的重復使用

請求已經被減少到剩下一個了,這是因為所有的元件都重復使用了一個同一個響應。通過這種方法將可以大大減少服務器的負載以及前端的運行時間。

感謝各位的閱讀!關于“前端開發中怎么處理AJAX請求的重復使用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宝坻区| 泗阳县| 新乡县| 景洪市| 宣城市| 山西省| 洪雅县| 彰武县| 柳州市| 井陉县| 东港市| 当阳市| 青神县| 襄汾县| 新昌县| 西华县| 辰溪县| 大方县| 岳普湖县| 嘉荫县| 永泰县| 佳木斯市| 金坛市| 大城县| 屏边| 阿克苏市| 南丹县| 惠安县| 巨鹿县| 三江| 仁怀市| 怀化市| 兰西县| 元朗区| 余庆县| 霍州市| 太康县| 鄂温| 宿松县| 卓尼县| 辉南县|