国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記錄--前端實(shí)用小技巧: 自動(dòng)合并的網(wǎng)絡(luò)請(qǐng)求

這篇具有很好參考價(jià)值的文章主要介紹了記錄--前端實(shí)用小技巧: 自動(dòng)合并的網(wǎng)絡(luò)請(qǐng)求。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

這里給大家分享我在網(wǎng)上總結(jié)出來的一些知識(shí),希望對(duì)大家有所幫助

記錄--前端實(shí)用小技巧: 自動(dòng)合并的網(wǎng)絡(luò)請(qǐng)求

我們經(jīng)常會(huì)遇到一個(gè)場(chǎng)景,比如在一個(gè)列表中批量獲取用戶的信息。

?

記錄--前端實(shí)用小技巧: 自動(dòng)合并的網(wǎng)絡(luò)請(qǐng)求

如果我們一次性往后端發(fā)送幾十條請(qǐng)求是非常愚蠢的事情。此時(shí)我們就要學(xué)會(huì)如何使用批量獲取的邏輯。

但是批量獲取有一個(gè)問題就是,我需要在用戶列表項(xiàng)的上層去獲取,然后再把結(jié)果分發(fā)給下層

此時(shí)的結(jié)構(gòu)如下:

const List = () => {
	return itemInfoList.map((info) => <Item info={info} />)
}

這樣我們就可以很方便的解決我們遇到的問題啦,因?yàn)槭且粋€(gè)接口獲取的結(jié)果嘛。

但是!這種寫法不利于維護(hù)。因?yàn)?<Item /> 組件的依賴過于龐大,是一個(gè)完整的對(duì)象。對(duì)于其他組件來說很難復(fù)用,大概率這個(gè)組件就只能在一處地方用了。那么我想要復(fù)用怎么辦呢?

那就是寫成如下形式

const List = () => {
	return ids.map((id) => <Item id={id} />)
}

然后 <Item /> 組件內(nèi)部就可以根據(jù)傳入的id自行獲取對(duì)應(yīng)的數(shù)據(jù),然后自我處理了。

那么不就遇到開頭這個(gè)問題了嘛?如果一次渲染幾十個(gè)用戶組件,那么不就同時(shí)向后端發(fā)送幾十個(gè)網(wǎng)絡(luò)請(qǐng)求了嘛!

這時(shí)候我們需要實(shí)現(xiàn)一個(gè)邏輯,自動(dòng)收集并合并可以被合并的網(wǎng)絡(luò)請(qǐng)求。

完整代碼如下:

interface QueueItem<T, R> {
  params: T;
  resolve: (r: R) => void;
  reject: (reason: unknown) => void;
}

/**
 * 創(chuàng)建一個(gè)自動(dòng)合并請(qǐng)求的函數(shù)
 * 在一定窗口期內(nèi)的所有請(qǐng)求都會(huì)被合并提交合并發(fā)送
 * @param fn 合并后的請(qǐng)求函數(shù)
 * @param windowMs 窗口期
 */
export function createAutoMergedRequest<T, R>(
  fn: (mergedParams: T[]) => Promise<R[]>,
  windowMs = 200
): (params: T) => Promise<R> {
  let queue: QueueItem<T, R>[] = [];
  let timer: number | null = null;

  async function submitQueue() {
    timer = null; // 清空計(jì)時(shí)器以接受后續(xù)請(qǐng)求
    const _queue = [...queue];
    queue = []; // 清空隊(duì)列

    try {
      const list = await fn(_queue.map((q) => q.params));
      _queue.forEach((q1, i) => {
        q1.resolve(list[i]);
      });
    } catch (err) {
      _queue.forEach((q2) => {
        q2.reject(err);
      });
    }
  }

  return (params: T): Promise<R> => {
    if (!timer) {
      // 如果沒有開始窗口期,則創(chuàng)建
      timer = window.setTimeout(() => {
        submitQueue();
      }, windowMs);
    }

    return new Promise<R>((resolve, reject) => {
      queue.push({
        params,
        resolve,
        reject,
      });
    });
  };
}

用法是:

const fetchUserInfo = createAutoMergedRequest<string, UserBaseInfo>(
  async (userIds) => {
    const { data } = await request.post('/api/user/getUserInfoList', {
      userIds,
    });

    return data;
  }
);

fetchUserInfo(1)
fetchUserInfo(2)
fetchUserInfo(3)

接下來我們來解讀一下代碼。

先看整體架構(gòu)。 createAutoMergedRequest 函數(shù)返回了一個(gè)匿名函數(shù),來接受參數(shù)并返回結(jié)果請(qǐng)求。但是需要注意的是我們定義了兩個(gè)泛型 TR 。其中 createAutoMergedRequest 接受的 fn 參數(shù)的類型是 (mergedParams: T[]) => Promise<R[]> ,而返回的函數(shù)定義是 (params: T): Promise<R> 。這是因?yàn)樗麜?huì)自動(dòng)把請(qǐng)求的結(jié)果拆分成獨(dú)立的返回值返回到對(duì)應(yīng)的調(diào)用處。

我們看返回的函數(shù)體:

if (!timer) {
    // 如果沒有開始窗口期,則創(chuàng)建
    timer = window.setTimeout(() => {
      submitQueue();
    }, windowMs);
  }

  return new Promise<R>((resolve, reject) => {
    queue.push({
      params,
      resolve,
      reject,
    });
  });

首先判斷閉包中是否存在定時(shí)器 timer, 如果沒有則創(chuàng)建一個(gè)timer,在 windowMs 后執(zhí)行 submitQueue 方法。我們把 windowMs 定義為窗口期,在這個(gè)窗口期內(nèi)調(diào)用該函數(shù)的請(qǐng)求都會(huì)被收集起來。

然后創(chuàng)建返回一個(gè)promise,把參數(shù)和promise相關(guān)的下一步操作都推到 queue 中。

等到若干次調(diào)用后,定時(shí)器到時(shí)間了,喚起回調(diào)執(zhí)行submitQueue 方法,我們來看看 submitQueue 的操作。

async function submitQueue() {
  timer = null; // 清空計(jì)時(shí)器以接受后續(xù)請(qǐng)求
  const _queue = [...queue];
  queue = []; // 清空隊(duì)列
  const ret = fn(_queue.map((q) => q.params));

  try {
    const list = await fn(_queue.map((q) => q.params));
    _queue.forEach((q1, i) => {
      q1.resolve(list[i]);
    });
  } catch (err) {
    _queue.forEach((q2) => {
      q2.reject(err);
    });
  }
}

執(zhí)行前我們會(huì)做一些前置工作,清理 timer, 清理 queue 并把隊(duì)列里的項(xiàng)單獨(dú)存放起來,防止影響到下一次執(zhí)行。

然后我們通過 fn(_queue.map((q) => q.params)) 來把隊(duì)列中的參數(shù)拿出來,傳給 fn 調(diào)用。此時(shí)的 fn 就會(huì)接收到一個(gè)數(shù)組。并確保返回的結(jié)果也是一個(gè)同等大小且一一對(duì)應(yīng)的數(shù)據(jù)即可。如果請(qǐng)求無誤,我們就循環(huán)隊(duì)列,把結(jié)果通過隊(duì)列中記錄的 resolve 把結(jié)果返回給我們之前創(chuàng)建的promise。

這樣我們就實(shí)現(xiàn)了一個(gè)工具函數(shù),我們可以在一個(gè)窗口期內(nèi)收集到多個(gè)網(wǎng)絡(luò)請(qǐng)求,并把他們匯聚成一個(gè)請(qǐng)求發(fā)送到后端。后端結(jié)果返回回來后,我們?cè)侔颜?qǐng)求結(jié)果拆分分發(fā)給獨(dú)立的調(diào)用方。

記錄--前端實(shí)用小技巧: 自動(dòng)合并的網(wǎng)絡(luò)請(qǐng)求

?

記錄--前端實(shí)用小技巧: 自動(dòng)合并的網(wǎng)絡(luò)請(qǐng)求

本文轉(zhuǎn)載于:

https://juejin.cn/post/7259275893796388925

如果對(duì)您有所幫助,歡迎您點(diǎn)個(gè)關(guān)注,我會(huì)定時(shí)更新技術(shù)文檔,大家一起討論學(xué)習(xí),一起進(jìn)步。

?記錄--前端實(shí)用小技巧: 自動(dòng)合并的網(wǎng)絡(luò)請(qǐng)求文章來源地址http://www.zghlxwxcb.cn/news/detail-633083.html

到了這里,關(guān)于記錄--前端實(shí)用小技巧: 自動(dòng)合并的網(wǎng)絡(luò)請(qǐng)求的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 記錄--前端實(shí)現(xiàn)并發(fā)請(qǐng)求限制

    記錄--前端實(shí)現(xiàn)并發(fā)請(qǐng)求限制

    前兩天我的新同事告訴我一個(gè)困擾著他的問題,就是低代碼平臺(tái)中存在很多模塊,這些模塊的渲染是由模塊自身處理的,簡(jiǎn)言之就是組件請(qǐng)求了自己的數(shù)據(jù),一個(gè)兩個(gè)模塊還好,要是一次請(qǐng)求了幾十個(gè)模塊,就會(huì)出現(xiàn)請(qǐng)求阻塞的問題,而且模塊的請(qǐng)求都特別大。 大量的并發(fā)請(qǐng)

    2024年02月08日
    瀏覽(21)
  • 記錄--前端中 JS 發(fā)起的請(qǐng)求可以暫停嗎

    記錄--前端中 JS 發(fā)起的請(qǐng)求可以暫停嗎

    在前端中,JavaScript(JS)可以使用XMLHttpRequest對(duì)象或fetch API來發(fā)起網(wǎng)絡(luò)請(qǐng)求。然而,JavaScript本身并沒有提供直接的方法來暫停請(qǐng)求的執(zhí)行。一旦請(qǐng)求被發(fā)送,它會(huì)繼續(xù)執(zhí)行并等待響應(yīng)。 盡管如此,你可以通過一些技巧或庫來模擬請(qǐng)求的暫停和繼續(xù)執(zhí)行。下面是一種常見的方法

    2024年02月05日
    瀏覽(20)
  • 實(shí)用技巧:Linux上實(shí)現(xiàn)OpenGauss數(shù)據(jù)庫遠(yuǎn)程連接,方便的跨網(wǎng)絡(luò)數(shù)據(jù)操作

    實(shí)用技巧:Linux上實(shí)現(xiàn)OpenGauss數(shù)據(jù)庫遠(yuǎn)程連接,方便的跨網(wǎng)絡(luò)數(shù)據(jù)操作

    openGauss是一款開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),采用木蘭寬松許可證v2發(fā)行。openGauss內(nèi)核深度融合華為在數(shù)據(jù)庫領(lǐng)域多年的經(jīng)驗(yàn),結(jié)合企業(yè)級(jí)場(chǎng)景需求,持續(xù)構(gòu)建競(jìng)爭(zhēng)力特性. 結(jié)合cpolar 內(nèi)網(wǎng)穿透工具,即可實(shí)現(xiàn)遠(yuǎn)程訪問本地openGauss,實(shí)現(xiàn)遠(yuǎn)程訪問,下面介紹從Linux安裝到遠(yuǎn)程訪問的方式

    2024年02月08日
    瀏覽(24)
  • Objective-C網(wǎng)絡(luò)請(qǐng)求開發(fā)的高效實(shí)現(xiàn)方法與技巧

    在移動(dòng)應(yīng)用開發(fā)中,網(wǎng)絡(luò)請(qǐng)求是一項(xiàng)至關(guān)重要的技術(shù)。Objective-C作為iOS平臺(tái)的主要開發(fā)語言之一,擁有豐富的網(wǎng)絡(luò)請(qǐng)求開發(fā)工具和技術(shù)。本文將介紹如何利用Objective-C語言實(shí)現(xiàn)高效的網(wǎng)絡(luò)請(qǐng)求,以及一些實(shí)用的技巧和方法。 Objective-C是一種基于C語言的面向?qū)ο缶幊陶Z言,它具

    2024年04月14日
    瀏覽(28)
  • 高級(jí)網(wǎng)絡(luò)調(diào)試技巧:使用Charles Proxy捕獲和修改HTTP/HTTPS請(qǐng)求

    高級(jí)網(wǎng)絡(luò)調(diào)試技巧:使用Charles Proxy捕獲和修改HTTP/HTTPS請(qǐng)求

    目錄 1、簡(jiǎn)介 2、安裝和設(shè)置 3、捕獲HTTP/HTTPS請(qǐng)求 4、修改HTTP/HTTPS請(qǐng)求 5、斷點(diǎn)和日志記錄 6、過濾和排序請(qǐng)求 7、導(dǎo)出和導(dǎo)入數(shù)據(jù) 8、高級(jí)功能和技術(shù) 9、實(shí)際應(yīng)用 總結(jié) 在調(diào)試網(wǎng)絡(luò)應(yīng)用時(shí),了解如何捕獲和修改HTTP/HTTPS請(qǐng)求是非常有用的。這些技巧對(duì)于識(shí)別和解決問題,以及測(cè)

    2024年02月08日
    瀏覽(22)
  • 使用 Axios 實(shí)現(xiàn)前端網(wǎng)絡(luò)請(qǐng)求

    在現(xiàn)代的 Web 開發(fā)中,網(wǎng)絡(luò)請(qǐng)求是不可或缺的一部分。前端開發(fā)者需要與后端服務(wù)器通信以獲取數(shù)據(jù)、發(fā)送表單、或者執(zhí)行其他操作。在過去,開發(fā)者通常使用 XMLHttpRequest (XHR) 對(duì)象來處理這些請(qǐng)求,但現(xiàn)在有了更加現(xiàn)代化和簡(jiǎn)潔的解決方案,其中一種就是 Axios。 Axios 是一個(gè)基

    2024年03月23日
    瀏覽(64)
  • 前端uniapp封裝網(wǎng)絡(luò)請(qǐng)求詳情教程

    前端uniapp封裝網(wǎng)絡(luò)請(qǐng)求詳情教程

    1,common文件夾下http.api.js,定義接口 2,common文件夾下http.interceptor.js,請(qǐng)求封裝 3,全局?jǐn)?shù)據(jù)定義 store文件夾下index.js 注意:vuex的使用前要先導(dǎo)入vuex(npm i vuex),在該方法中還需導(dǎo)入vuex-persistedstate(npm i vuex-persistedstate) 4,main.js中聲明(例子中用的比較雜,挑有用的使用) 5,接

    2024年02月02日
    瀏覽(15)
  • 記錄--前端無感知刷新token & 超時(shí)自動(dòng)退出

    記錄--前端無感知刷新token & 超時(shí)自動(dòng)退出

    因?yàn)閔ttp請(qǐng)求是無狀態(tài)的,是一次性的,請(qǐng)求之間沒有任何關(guān)系,服務(wù)端無法知道請(qǐng)求者的身份,所以需要鑒權(quán),來驗(yàn)證當(dāng)前用戶是否有訪問系統(tǒng)的權(quán)限。 以oauth2.0授權(quán)碼模式為例: 每次請(qǐng)求資源服務(wù)器時(shí)都會(huì)在請(qǐng)求頭中添加 Authorization: Bearer access_token 資源服務(wù)器會(huì)先判斷t

    2024年02月03日
    瀏覽(26)
  • 前端自動(dòng)化測(cè)試工具 Cypress 試用調(diào)研記錄

    目錄 前言 環(huán)境準(zhǔn)備 1.工具:vs code;環(huán)境:node.js。 2.安裝 cypress 3.安裝插件: 4.配置: 5.啟動(dòng)命令: helloworld: 第一個(gè)用例 元素定位方式 使用 request 請(qǐng)求進(jìn)行登錄 提取登錄方法為公共方法 命令行執(zhí)行所有用例 解決 chrome 下的跨域問題: 生成 Junit-allure 報(bào)表 生成 mocha awsome

    2024年02月16日
    瀏覽(25)
  • 前端Vue uni-app簡(jiǎn)單實(shí)用通用標(biāo)簽欄自動(dòng)換行 自適應(yīng)高度 可設(shè)置行數(shù) 可改標(biāo)簽顏色

    前端Vue uni-app簡(jiǎn)單實(shí)用通用標(biāo)簽欄自動(dòng)換行 自適應(yīng)高度 可設(shè)置行數(shù) 可改標(biāo)簽顏色

    隨著技術(shù)的發(fā)展,開發(fā)的復(fù)雜度也越來越高,傳統(tǒng)開發(fā)方式將一個(gè)系統(tǒng)做成了整塊應(yīng)用,經(jīng)常出現(xiàn)的情況就是一個(gè)小小的改動(dòng)或者一個(gè)小功能的增加可能會(huì)引起整體邏輯的修改,造成牽一發(fā)而動(dòng)全身。通過組件化開發(fā),可以有效實(shí)現(xiàn)單獨(dú)開發(fā),單獨(dú)維護(hù),而且他們之間可以隨

    2024年02月05日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包