成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

JavaScript使用promise處理多重復請求

瀏覽:42日期:2023-06-03 08:57:28
一、為什么要寫這個文章?

處理重復請求的文章想必大家也看過了很多,大多數都是分為在response返回之前發現重復請求就return掉的和使用節流/防抖來間接規避用戶頻繁操作兩種版本的。最近在使用的過程的中,發現這兩個版本在某些場景下還是有些局限性。

二、問題場景

如圖,我這個h5的頁面,頂部和底部都要顯示這個名片組件。這些名片的信息是通過一個接口來獲取的,當這個組件在當前頁面被初始化時,就會發生兩次重復的請求。

JavaScript使用promise處理多重復請求

JavaScript使用promise處理多重復請求

這時會面臨幾個抉擇:

1. 不對重復請求做任何處理。

缺點1:造成不必要的資源浪費,增大服務器的壓力 缺點2:http請求在瀏覽器中是有并發數限制的,如果頁面首屏的請求較多且沒有分層級加載的話,很容易造成請求阻塞,影響用戶第一時間看到主要內容

2. 對重復請求直接return掉。這也是部分文章的做法,不過這種做法有種局限性,就是直接認定后面的重復請求均為無效請求。

無效請求場景:用戶點擊了某個按鈕進行查詢或保存,在請求結果返回之前,后面點擊基本都算是無效請求,這種請求就是應該被阻止的。當然,也可以通過在按鈕上添加節流/防抖來規避這個問題 為何不適用于目前場景:這兩個名片的組件都是需要數據來渲染的,如果第二次重復的請求被return了,其中一個組件的名片就會沒有數據。

3. 把請求從組件中抽離出來放到父級的業務頁面中,再以props的方式傳進組件。

好處:只需要請求一次,兩個組件就可以共享一份數據。 局限性:只適用于單個業務頁面用到的情況。事實上這個組件很多個業務頁面在用,即使把請求的函數抽成公用的api,也是要在每個業務頁面初始化的時候調用一次,然后再以props的方式傳進組件。三、解決方式

核心思想

初始化一個handleList的數組 在請求發送前,根據入參是否相同判斷是否為重復請求 非重復請求:把改請求的參數和請求返回的Promise添加至數組中重復請求:使用find查找直接返回對應的Promise 請求完成后把handleList中之前添加的請求信息移除。

這個方案是什么都可以使用的,無論是使用axios、jq、fetch、小程序request。這里就寫實現的原理,使用時直接把對應的代碼放到對應的請求時機即可。

代碼示例

let handleList = [] // 請求列表/** * 模擬請求 * @author waldon * @date 2020/6/9 */const httpRequest = () => { return new Promise((resolve) => { setTimeout(() => { resolve(`請求成功,時間戳為:${new Date().getTime()}`) }, 1000) })}/** * 請求的相關處理 * @author waldon * @date 2020/6/9 * @param {String} url - * @param {Object} requestObj - 請求參數 * @returns {Promise} - 請求的promise */function requestTest(url, requestObj = {}) { // 因為入參一般不會涉及到復雜類型,JSON.stringify進行序列化對比其實夠用了 // 有個局限性就是入參的順序改變了就會影響判斷,不過這種特殊的改變一般在重復請求中不會出現 // 實在是有這種需求的,換成其他遞歸對比的api,lodash也有類似的api const sameHandle = handleList.find( (item) => item.url === url && JSON.stringify(item.requestObj) === JSON.stringify(requestObj) ) if (sameHandle) { // 遇到相同請求直接返回之前請求的promise console.log(`存在重復請求,直接返回`) return sameHandle.handle } const handle = new Promise((resolve, reject) => { httpRequest() .then((res) => {resolve(res) }) .catch((err) => {reject(err) }) .finally(() => {// 無論請求結果如果,都需要把對應的請求移除掉handleList = handleList.filter( (item) =>item.url !== url && JSON.stringify(item.requestObj) !== JSON.stringify(requestObj) ) }) }) handleList.push({ url, requestObj, handle }) return handle}// *******************************我是華麗的分割線 開始使用*******************************const params = { name: ’waldon’}requestTest(’/ajax/sameUrl’, params).then((res) => { console.log(`首次請求結果`, res) console.log(`handleList:`, handleList)})requestTest(’/ajax/sameUrl’, params).then((res) => { console.log(`重復請求結果`, res) console.log(`handleList:`, handleList) // 請求列表中始終只有一個請求 setTimeout(() => { console.log(`請求完成后的handleList:`, handleList) // 請求完成handleList對應的請求會被清除 }, 100)})setTimeout(() => { // 特意延遲500ms請求,因為我們設置了接口1s才返回,所以應該得到一樣的結果 requestTest(’/ajax/sameUrl’, params).then((res) => { console.log(`重復請求結果`, res) console.log(`handleList:`, handleList) })}, 500)

輸出結果

存在重復請求,直接返回存在重復請求,直接返回首次請求結果 請求成功,時間戳為:1621650375540handleList: [ { url: ’/ajax/sameUrl’, requestObj: { name: ’waldon’ }, handle: Promise { ’請求成功,時間戳為:1621650375540’ } }]重復請求結果 請求成功,時間戳為:1621650375540handleList: [ { url: ’/ajax/sameUrl’, requestObj: { name: ’waldon’ }, handle: Promise { ’請求成功,時間戳為:1621650375540’ } }]重復請求結果 請求成功,時間戳為:1621650375540handleList: [ { url: ’/ajax/sameUrl’, requestObj: { name: ’waldon’ }, handle: Promise { ’請求成功,時間戳為:1621650375540’ } }]請求完成后的handleList: []

代碼地址 codepen

https://codepen.io/waldonUB/pen/ZEeeONM

注意的點

不要對response中的數據進行增刪操作。因為重復請求返回Promise中的對象引用地址都是同一個,改動了就會造成數據污染。特殊情況時可以淺拷貝響應結果再處理,或者是增加對應的斷言。 處理重復的請求時,最好在log中提示一下,同時在組件中注釋好原因和使用場景,避免他人誤改 做好極端情況下,請求失敗的處理,設置有效時間置空和移除請求信息,避免因為閉包堆積過多無用的請求信息造成內存泄漏。

到此這篇關于JavaScript使用promise處理多重復請求的文章就介紹到這了,更多相關js promise多重復請求內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品亚洲一区二区三区在线| 国产日韩欧美一区二区三区乱码| 日韩欧美中文一区| 久久99久国产精品黄毛片色诱| 久久福利一区| 亚洲免费看黄网站| 精品不卡一区| 亚洲精品国产一区二区精华液| 国内成人在线| 国产精品高潮呻吟| 伊人蜜桃色噜噜激情综合| 欧美日产国产精品| 国产主播一区二区| 欧美一级日韩一级| 99久久精品免费精品国产| 91精品国产美女浴室洗澡无遮挡| 国产一区二区三区在线观看精品 | 日韩不卡一区二区| 在线免费观看日本欧美| 麻豆极品一区二区三区| 欧美女孩性生活视频| 国产盗摄一区二区| 精品欧美乱码久久久久久| 99久久婷婷国产综合精品电影 | 亚洲女子a中天字幕| 91久久精品国产91久久性色tv| 亚洲男女一区二区三区| 午夜一区二区三区不卡视频| 午夜视频一区二区| 色屁屁一区二区| 紧缚捆绑精品一区二区| 日韩视频免费直播| 色综合天天性综合| 亚洲靠逼com| 久久夜色精品| 国产一区二区三区在线观看精品| 日韩精品在线网站| 欧美成人首页| 一区二区三区四区乱视频| 老牛嫩草一区二区三区日本| 麻豆免费精品视频| 日韩一区二区三免费高清| k8久久久一区二区三区| 中文字幕av一区二区三区高| 国产精品乱看| 精品一区二区三区免费播放| 日韩一区二区在线观看视频播放| 欧美另类亚洲| 亚洲午夜影视影院在线观看| 久久一区国产| 国产91精品一区二区麻豆网站| 欧美经典一区二区| 先锋影音一区二区三区| 国内一区二区视频| 国产天堂亚洲国产碰碰| 欧美在线资源| 亚洲成人av电影在线| 在线电影一区二区三区| 欧美+日本+国产+在线a∨观看| 中文字幕一区二区三| 久久久久se| 成人高清免费在线播放| 亚洲蜜臀av乱码久久精品蜜桃| 欧美色综合天天久久综合精品| 91亚洲精品久久久蜜桃网站| 一区二区在线观看av| 欧美日韩国产综合视频在线观看| 91亚洲精品久久久蜜桃| 午夜免费久久看| 日韩欧美在线不卡| 欧美日韩三级| 免费人成黄页网站在线一区二区| 欧美电影免费观看高清完整版 | 91精品在线免费观看| 国产精品99一区二区| 日韩精品电影一区亚洲| 日韩欧美久久久| 国产欧美一级| 国产**成人网毛片九色 | 国产不卡免费视频| 中文字幕一区视频| 色婷婷国产精品| a亚洲天堂av| 香蕉影视欧美成人| 欧美不卡一区二区| 久久人人97超碰人人澡爱香蕉| 成人自拍视频在线观看| 亚洲成年人网站在线观看| 精品国免费一区二区三区| 国产偷自视频区视频一区二区| 国产专区综合网| 国产精品国产三级国产有无不卡 | 狠狠色综合网| 亚洲亚洲人成综合网络| 日韩精品最新网址| 久久福利电影| 欧美精品99| 精久久久久久久久久久| 亚洲欧美一区二区三区孕妇| 欧美老人xxxx18| 国产欧美午夜| 北条麻妃一区二区三区| 男人的j进女人的j一区| 国产精品嫩草久久久久| 3d成人h动漫网站入口| 亚洲永久字幕| 欧美久色视频| 国产美女在线精品| 亚洲亚洲人成综合网络| 久久久久久亚洲综合| 欧美体内she精高潮| 亚洲精品护士| voyeur盗摄精品| 精品写真视频在线观看 | 日本视频一区二区三区| 国产精品福利在线播放| 精品免费日韩av| 在线看日韩精品电影| 亚洲精品男同| 91在线播放网址| 国产精品一区二区久久不卡| 亚洲国产成人91porn| 中文一区二区完整视频在线观看| 91精品国产一区二区三区香蕉| 美女日韩在线中文字幕| 激情六月综合| 不卡一区中文字幕| 国产资源精品在线观看| 日韩不卡一二三区| 亚洲精选在线视频| 国产精品久久影院| 26uuu另类欧美| 91麻豆精品国产91久久久久久久久| 久久精品国产清高在天天线| 亚洲精品国产日韩| 国产真实久久| 欧美日本在线| 色综合天天综合在线视频| 高清国产一区二区| 国产一区二区三区在线观看免费视频 | 精品国产伦一区二区三区观看方式 | 久久精品国产精品亚洲红杏| 亚洲午夜激情av| 亚洲三级小视频| 国产精品日日摸夜夜摸av| 久久亚洲二区三区| 精品久久久久久久久久久久久久久久久 | 国产亚洲精品自拍| 亚洲黄色影片| 一区二区三区我不卡| 欧美连裤袜在线视频| 99精品久久99久久久久| 岛国一区二区在线观看| 国产九九视频一区二区三区| 麻豆一区二区三| 日本伊人色综合网| 日本中文在线一区| 欧美aaaaaa午夜精品| 亚洲一区在线观看视频| 亚洲精品福利视频网站| 国产精品无人区| 国产欧美精品一区二区三区四区| 久久久久久久性| 久久精品欧美日韩| 久久精品一区二区三区不卡| 久久久精品国产免大香伊| 久久精品欧美一区二区三区麻豆| 久久午夜电影网| 国产午夜精品福利| 中文字幕成人av| 亚洲婷婷国产精品电影人久久| 综合自拍亚洲综合图不卡区| 18成人在线视频| 日韩理论片网站| 亚洲一区自拍偷拍| 天天综合天天综合色| 日韩电影在线看| 美女视频黄 久久| 激情综合亚洲精品| 国产精品一区二区果冻传媒| 国产99久久久国产精品潘金| 高清不卡在线观看av| 成a人片亚洲日本久久| 91麻豆精品在线观看| 欧美全黄视频| 9久re热视频在线精品| 欧美一区二区三区四区在线观看地址| 91麻豆国产福利精品| 国产精品激情电影| 99精品国产在热久久| 久久婷婷丁香| 欧美日韩五月天| 日韩欧美激情四射| 2021久久国产精品不只是精品| 久久九九久精品国产免费直播| 国产精品色呦呦| 亚洲激情在线激情| 日韩综合一区二区| 国产成人在线影院| 欧美精品一区二区视频|