日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript使用promise處理多重復(fù)請求

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

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

二、問題場景

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

JavaScript使用promise處理多重復(fù)請求

JavaScript使用promise處理多重復(fù)請求

這時(shí)會(huì)面臨幾個(gè)抉擇:

1. 不對(duì)重復(fù)請求做任何處理。

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

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

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

3. 把請求從組件中抽離出來放到父級(jí)的業(yè)務(wù)頁面中,再以props的方式傳進(jìn)組件。

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

核心思想

初始化一個(gè)handleList的數(shù)組 在請求發(fā)送前,根據(jù)入?yún)⑹欠裣嗤袛嗍欠駷橹貜?fù)請求 非重復(fù)請求:把改請求的參數(shù)和請求返回的Promise添加至數(shù)組中重復(fù)請求:使用find查找直接返回對(duì)應(yīng)的Promise 請求完成后把handleList中之前添加的請求信息移除。

這個(gè)方案是什么都可以使用的,無論是使用axios、jq、fetch、小程序request。這里就寫實(shí)現(xiàn)的原理,使用時(shí)直接把對(duì)應(yīng)的代碼放到對(duì)應(yīng)的請求時(shí)機(jī)即可。

代碼示例

let handleList = [] // 請求列表/** * 模擬請求 * @author waldon * @date 2020/6/9 */const httpRequest = () => { return new Promise((resolve) => { setTimeout(() => { resolve(`請求成功,時(shí)間戳為:${new Date().getTime()}`) }, 1000) })}/** * 請求的相關(guān)處理 * @author waldon * @date 2020/6/9 * @param {String} url - * @param {Object} requestObj - 請求參數(shù) * @returns {Promise} - 請求的promise */function requestTest(url, requestObj = {}) { // 因?yàn)槿雲(yún)⒁话悴粫?huì)涉及到復(fù)雜類型,JSON.stringify進(jìn)行序列化對(duì)比其實(shí)夠用了 // 有個(gè)局限性就是入?yún)⒌捻樞蚋淖兞司蜁?huì)影響判斷,不過這種特殊的改變一般在重復(fù)請求中不會(huì)出現(xiàn) // 實(shí)在是有這種需求的,換成其他遞歸對(duì)比的api,lodash也有類似的api const sameHandle = handleList.find( (item) => item.url === url && JSON.stringify(item.requestObj) === JSON.stringify(requestObj) ) if (sameHandle) { // 遇到相同請求直接返回之前請求的promise console.log(`存在重復(fù)請求,直接返回`) return sameHandle.handle } const handle = new Promise((resolve, reject) => { httpRequest() .then((res) => {resolve(res) }) .catch((err) => {reject(err) }) .finally(() => {// 無論請求結(jié)果如果,都需要把對(duì)應(yīng)的請求移除掉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(`首次請求結(jié)果`, res) console.log(`handleList:`, handleList)})requestTest(’/ajax/sameUrl’, params).then((res) => { console.log(`重復(fù)請求結(jié)果`, res) console.log(`handleList:`, handleList) // 請求列表中始終只有一個(gè)請求 setTimeout(() => { console.log(`請求完成后的handleList:`, handleList) // 請求完成handleList對(duì)應(yīng)的請求會(huì)被清除 }, 100)})setTimeout(() => { // 特意延遲500ms請求,因?yàn)槲覀冊O(shè)置了接口1s才返回,所以應(yīng)該得到一樣的結(jié)果 requestTest(’/ajax/sameUrl’, params).then((res) => { console.log(`重復(fù)請求結(jié)果`, res) console.log(`handleList:`, handleList) })}, 500)

輸出結(jié)果

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

代碼地址 codepen

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

注意的點(diǎn)

不要對(duì)response中的數(shù)據(jù)進(jìn)行增刪操作。因?yàn)橹貜?fù)請求返回Promise中的對(duì)象引用地址都是同一個(gè),改動(dòng)了就會(huì)造成數(shù)據(jù)污染。特殊情況時(shí)可以淺拷貝響應(yīng)結(jié)果再處理,或者是增加對(duì)應(yīng)的斷言。 處理重復(fù)的請求時(shí),最好在log中提示一下,同時(shí)在組件中注釋好原因和使用場景,避免他人誤改 做好極端情況下,請求失敗的處理,設(shè)置有效時(shí)間置空和移除請求信息,避免因?yàn)殚]包堆積過多無用的請求信息造成內(nèi)存泄漏。

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

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费国产自线拍一欧美视频| 老鸭窝一区二区久久精品| 亚洲国产欧美日本视频| 成人亚洲一区| 视频福利一区| 欧美69视频| 综合激情婷婷| 久久国产精品免费精品3p| 欧美一区网站| 精品精品久久| 欧美成人日韩| 日韩中文字幕1| 欧美日韩亚洲一区三区| 精品国产99| 亚洲午夜电影| 一本综合精品| 国产精品.xx视频.xxtv| 国产成人精品亚洲日本在线观看| 天堂网在线观看国产精品| 蜜桃av一区| 国产高清亚洲| 伊人国产精品| 狠狠躁少妇一区二区三区| 欧美日韩四区| 国产精品视频一区二区三区| 99久久婷婷这里只有精品| 亚洲不卡视频| 国产一区二区三区天码| 久久国产成人| 精品五月天堂| 亚洲欧美日韩国产一区| 久久免费福利| 首页欧美精品中文字幕| 国产日韩1区| 成人精品亚洲| 国产麻豆精品久久| 欧美一区二区性| 欧美视频精品全部免费观看| 99久久精品费精品国产| 亚洲+小说+欧美+激情+另类| 久久精品欧洲| 蜜桃视频在线观看一区二区| 久久精品免费看| 欧美综合国产| 国产+成+人+亚洲欧洲在线| 一区二区视频欧美| 美女在线视频一区| 亚洲激情五月| 精品三级在线观看视频| 热久久国产精品| av免费不卡国产观看| 亚洲精品在线二区| 极品裸体白嫩激情啪啪国产精品| 欧美日韩精品一区二区三区在线观看| 日韩电影在线视频| 国产精品日本一区二区三区在线| 欧美午夜精品一区二区三区电影| 国产精品亚洲片在线播放| 日韩视频免费| 在线人成日本视频| 国产美女视频一区二区| 亚洲深夜福利| 999国产精品永久免费视频app| 国产精品综合色区在线观看| 亚洲欧美日韩专区| 日本久久成人网| 精品视频自拍| 蜜桃av一区二区在线观看| 伊人久久国产| 国产精久久久| 日韩精品一区二区三区免费视频| 欧美理论视频| 日本在线高清| 精品少妇av| 国产精品1区在线| 日本中文字幕一区二区视频| 夜久久久久久| 久久青草久久| 超级白嫩亚洲国产第一| 欧美激情精品| 久久精品xxxxx| 中文字幕成人| 日韩中文字幕亚洲一区二区va在线| 91精品国产福利在线观看麻豆| 老鸭窝一区二区久久精品| 日本午夜免费一区二区| 免费人成精品欧美精品| 黄色亚洲精品| 激情丁香综合| 99精品在线免费在线观看| 亚洲精品国产嫩草在线观看| 成人污污视频| 美女国产一区二区三区| 国产精品久一| 国产欧美日韩精品一区二区免费| 蜜桃av一区二区三区电影| 国产亚洲欧洲| 蜜桃传媒麻豆第一区在线观看| 伊人影院久久| 亚洲视频www| 天堂va蜜桃一区二区三区| 夜夜嗨av一区二区三区网站四季av| 国产专区一区| 久久一级电影| 亚洲一区欧美激情| 中文精品视频| 丝袜a∨在线一区二区三区不卡| 性色av一区二区怡红| 国产精品普通话对白| 国产亚洲高清视频| 日韩一区精品视频| 日本不卡高清视频| 国产精品视频一区二区三区| 久久精品亚洲一区二区| 青青青免费在线视频| 久久精品亚洲人成影院| 免费不卡中文字幕在线| 久久国产高清| 国产日韩亚洲| 久久精品午夜| 色婷婷精品视频| 伊人久久婷婷| 亚洲日韩视频| 国产麻豆一区| 国产黄大片在线观看| 亚洲精品.com| 在线视频日韩| 日本精品久久| 麻豆一区二区在线| 欧美日韩免费观看视频| 亚洲欧美日韩视频二区| 欧美视频二区| 国产一区二区三区不卡av | 亚洲精品国模| 国产欧美二区| 亚洲成a人片| 快she精品国产999| 国产日韩在线观看视频| 国产精品精品| 91精品成人| 日本不卡视频在线观看| 激情久久99| 亚洲午夜一级| 日韩视频1区| 免费污视频在线一区| 久久国产88| 久久久久亚洲精品中文字幕| 日韩成人亚洲| 午夜久久av| 另类小说一区二区三区| 久久久成人网| 啪啪亚洲精品| 免费在线小视频| 另类av一区二区| 国产乱码精品一区二区亚洲| 久久久一本精品| 亚洲精品一二三**| 精品国产欧美日韩| 日韩中文欧美在线| 色婷婷综合网| 玖玖玖国产精品| 国产成人精品一区二区三区视频| 午夜国产欧美理论在线播放| 欧美影院视频| 久久国产主播| 日韩三区四区| 亚洲91久久| 欧美日韩亚洲三区| 午夜欧美精品久久久久久久| 国产欧美自拍| 日韩网站在线| 麻豆国产在线| 国产精品色在线网站| 99国产精品久久久久久久成人热| 国产精品啊啊啊| 视频一区二区欧美| 综合日韩av| 91欧美精品| 播放一区二区| 久久香蕉网站| 日本一区免费网站| 婷婷成人综合| 高清久久精品| 日本成人中文字幕在线视频| 国产在线|日韩| 成人在线视频中文字幕| 午夜天堂精品久久久久| 久久中文字幕av一区二区不卡| 国产伦精品一区二区三区视频| 久久xxxx| 国内激情久久| 欧美国产美女| 国产精品网址| 亚洲精品第一| 国产偷自视频区视频一区二区| 欧美黄色网页| 色乱码一区二区三区网站| 欧美日韩 国产精品| 亚洲三级在线| 在线观看视频免费一区二区三区|