最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript前端控制網(wǎng)絡(luò)并發(fā)數(shù)目的常見(jiàn)方法小結(jié)

 更新時(shí)間:2023年12月22日 10:40:20   作者:慕仲卿  
控制前端發(fā)起請(qǐng)求的并發(fā)數(shù),即限制同一時(shí)間內(nèi)進(jìn)行處理的請(qǐng)求數(shù)量,是一種有效的策略,本文將詳細(xì)介紹前端控制并發(fā)數(shù)的幾種常見(jiàn)做法,希望對(duì)大家有所幫助

在現(xiàn)代Web應(yīng)用開(kāi)發(fā)中,提高用戶體驗(yàn)的同時(shí)要確保服務(wù)器負(fù)載平衡是至關(guān)重要的。控制前端發(fā)起請(qǐng)求的并發(fā)數(shù),即限制同一時(shí)間內(nèi)進(jìn)行處理的請(qǐng)求數(shù)量,是一種有效的策略。本文將詳細(xì)介紹前端控制并發(fā)數(shù)的幾種常見(jiàn)做法,并且提供具體的代碼示例。

隊(duì)列機(jī)制

隊(duì)列是實(shí)現(xiàn)并發(fā)控制常用的數(shù)據(jù)結(jié)構(gòu)。它遵循先進(jìn)先出(FIFO)的原則,能夠按照請(qǐng)求到達(dá)的順序逐一處理。

示例:基于 Promise 的請(qǐng)求隊(duì)列

在JavaScript中,可以利用Promise來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的請(qǐng)求隊(duì)列。下面是一個(gè)示例代碼:

class PromiseQueue {
  constructor(maxConcurrent) {
    this.maxConcurrent = maxConcurrent;
    this.queue = [];
    this.currentCount = 0;
  }

  add(promiseCreator) {
    return new Promise((resolve, reject) => {
      this.queue.push({
        promiseCreator,
        resolve,
        reject
      });
      this.tryToRun();
    });
  }

  tryToRun() {
    if (this.queue.length === 0 || this.currentCount >= this.maxConcurrent) {
      return;
    }
    this.currentCount++;
    const { promiseCreator, resolve, reject } = this.queue.shift();
    promiseCreator().then(resolve, reject).finally(() => {
      this.currentCount--;
      this.tryToRun();
    });
  }
}

利用此隊(duì)列可以如下方式控制并發(fā):

// 實(shí)例化隊(duì)列,設(shè)置最大并發(fā)數(shù)為 2
const queue = new PromiseQueue(2);

// 添加請(qǐng)求到隊(duì)列
queue.add(() => fetch(url1)).then(handleResponse);
queue.add(() => fetch(url2)).then(handleResponse);
queue.add(() => fetch(url3)).then(handleResponse);

在此示例中,只有兩個(gè)請(qǐng)求會(huì)立即執(zhí)行,第三個(gè)請(qǐng)求會(huì)等待前兩個(gè)中的某個(gè)完成后再開(kāi)始。

控制并發(fā)的庫(kù)

市面上有許多專門(mén)用于控制并發(fā)的JavaScript庫(kù),如p-limit, async等。

示例:使用 p-limit 控制并發(fā)

p-limit是一個(gè)輕量級(jí)的庫(kù),可以方便地限制并發(fā)數(shù):

import pLimit from 'p-limit';

const limit = pLimit(2);

const input = [
    limit(() => fetch(url1)),
    limit(() => fetch(url2)),
    limit(() => fetch(url3)),
    limit(() => fetch(url4)),
];

// 只有 2 個(gè)請(qǐng)求被同時(shí)處理
Promise.all(input).then(results => {
    // 處理結(jié)果
});

在上述代碼中,limit函數(shù)會(huì)保證同時(shí)只有兩個(gè)請(qǐng)求在處理。

XMLHttpRequest的abort方法

在使用XMLHttpRequest(XHR)對(duì)象發(fā)送請(qǐng)求時(shí),可以在請(qǐng)求數(shù)量超過(guò)設(shè)定的并發(fā)限制時(shí)調(diào)用abort方法來(lái)取消請(qǐng)求。

示例:使用XMLHttpRequest和abort控制并發(fā)

const MAX_CONCURRENT = 2;
let concurrentCount = 0;
const xhrPool = [];

function fetchWithXhr(url) {
    if (concurrentCount >= MAX_CONCURRENT) {
        setTimeout(() => fetchWithXhr(url), 200); // 200ms 后重試
        return;
    }
    concurrentCount++;
    const xhr = new XMLHttpRequest();
    xhr.open("GET", url);
    xhr.onload = () => {
        handleResponse(xhr.response);
        concurrentCount--;
        if (xhrPool.length > 0) {
            const newXhr = xhrPool.shift();
            fetchWithXhr(newXhr.url);
        }
    };
    xhr.onerror = xhr.onabort = () => {
        concurrentCount--;
    };
    xhr.send();
}

function abortExtraRequests() {
    while (concurrentCount > MAX_CONCURRENT) {
        const xhrToAbort = xhrPool.pop();
        xhrToAbort.abort();
    }
}

// 發(fā)起請(qǐng)求
fetchWithXhr("https://api.example.com/data1");
fetchWithXhr("https://api.example.com/data2");
fetchWithXhr("https://api.example.com/data3");

在此示例中,超出并發(fā)限制的請(qǐng)求將會(huì)被推遲執(zhí)行,而非立即取消;并且可以使用abortExtraRequests函數(shù)對(duì)并發(fā)數(shù)目進(jìn)行校驗(yàn),去除超過(guò)的部分。

Fetch API的AbortController

Fetch API提供了AbortController接口,通過(guò)它可以隨時(shí)取消一個(gè)或多個(gè)請(qǐng)求。

示例:使用AbortController控制并發(fā)

const MAX_CONCURRENT = 2;
let concurrentCount = 0;
const controllerQueue = new Map();

async function fetchWithAbortController(url) {
    if (concurrentCount >= MAX_CONCURRENT) {
        await new Promise(resolve => setTimeout(resolve, 200)); // 200ms 后重試
        return fetchWithAbortController(url);
    }

    const controller = new AbortController();
    concurrentCount++;
    controllerQueue.set(url, controller);

    try {
        const response = await fetch(url, { signal: controller.signal });
        handleResponse(await response.json());
    } catch (error) {
        // 錯(cuò)誤處理
    } finally {
        controllerQueue.delete(url);
        concurrentCount--;
        if (__yourCondition) {
            controllerQueue.get(__specificUrl).abort(); // 取消下一個(gè)請(qǐng)求
        }
    }
}

// 發(fā)起請(qǐng)求
fetchWithAbortController("https://api.example.com/data1");
fetchWithAbortController("https://api.example.com/data2");
fetchWithAbortController("https://api.example.com/data3");

在這個(gè)例子中,AbortController用于取消等待隊(duì)列中的請(qǐng)求,而且每個(gè)請(qǐng)求都有自己的AbortController實(shí)例。

通過(guò)以上方法,可以有效控制前端并發(fā)數(shù),避免服務(wù)器過(guò)載且優(yōu)化用戶體驗(yàn)。不需修改服務(wù)器配置或縮放服務(wù)器資源即可實(shí)現(xiàn)前端請(qǐng)求的優(yōu)雅管理。這些策略對(duì)于構(gòu)建響應(yīng)速度快、資源使用高效的Web應(yīng)用至關(guān)重要。

以上就是JavaScript前端控制網(wǎng)絡(luò)并發(fā)數(shù)目的常見(jiàn)方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于JavaScript控制網(wǎng)絡(luò)并發(fā)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue為div標(biāo)簽設(shè)置assets內(nèi)本地背景圖片的實(shí)現(xiàn)方法

    Vue為div標(biāo)簽設(shè)置assets內(nèi)本地背景圖片的實(shí)現(xiàn)方法

    在 Vue 中為 <div> 設(shè)置 assets 目錄下的本地背景圖片,需要通過(guò) Webpack 或 Vite 等構(gòu)建工具 處理路徑引用,本文通過(guò)代碼示例給大家介紹了詳細(xì)實(shí)現(xiàn)方法,需要的朋友可以參考下
    2025-05-05
  • JavaScript對(duì)象合并實(shí)現(xiàn)步驟介紹

    JavaScript對(duì)象合并實(shí)現(xiàn)步驟介紹

    這篇文章主要介紹了JavaScript對(duì)象合并實(shí)現(xiàn)步驟,為什么要合并?這是我在重構(gòu)代碼的時(shí)候的一個(gè)需求。簡(jiǎn)單來(lái)說(shuō),我會(huì)有若干個(gè)對(duì)象需要合并為一個(gè)對(duì)象。而這些對(duì)象為兩層,如果直接展開(kāi)或者賦值會(huì)涉及到深拷貝
    2023-01-01
  • JS刪除某個(gè)父元素下的所有子元素

    JS刪除某個(gè)父元素下的所有子元素

    JS中如何刪除某個(gè)父元素下的所有子元素?這里我介紹幾種方法,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • JavaScript/jQuery實(shí)現(xiàn)切換頁(yè)面效果

    JavaScript/jQuery實(shí)現(xiàn)切換頁(yè)面效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript或jQuery實(shí)現(xiàn)切換頁(yè)面效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 深入了解JavaScript中的函數(shù)式編程

    深入了解JavaScript中的函數(shù)式編程

    JavaScript是一門(mén)多范式的編程語(yǔ)言,其中函數(shù)式編程成為了一種受歡迎的范式之一,本文將帶您深入了解JavaScript函數(shù)式編程的核心概念和技術(shù),需要的可以參考一下
    2023-06-06
  • 親自教你TypeScript 項(xiàng)目搭建過(guò)程

    親自教你TypeScript 項(xiàng)目搭建過(guò)程

    這篇文章主要介紹了親自教你TypeScript 項(xiàng)目搭建過(guò)程,我記得前一天,我們配置過(guò)一份 webpack 配置,直接復(fù)制過(guò)來(lái)使用,這里就不多說(shuō)了,然后就是在項(xiàng)目中引入我們的 less,需要的朋友可以參考下
    2022-11-11
  • JavaScript獲取和操作時(shí)間戳的用法詳解

    JavaScript獲取和操作時(shí)間戳的用法詳解

    這篇文章主要介紹了JavaScript獲取和操作時(shí)間戳的相關(guān)資料,時(shí)間戳通常用于記錄時(shí)間、計(jì)算時(shí)間差、生成唯一的標(biāo)識(shí)符等,文章詳細(xì)講解了如何使用Date.now()和new?Date().getTime()獲取當(dāng)前時(shí)間戳,需要的朋友可以參考下
    2025-04-04
  • layui 數(shù)據(jù)表格+分頁(yè)+搜索+checkbox+緩存選中項(xiàng)數(shù)據(jù)的方法

    layui 數(shù)據(jù)表格+分頁(yè)+搜索+checkbox+緩存選中項(xiàng)數(shù)據(jù)的方法

    今天小編就為大家分享一篇layui 數(shù)據(jù)表格+分頁(yè)+搜索+checkbox+緩存選中項(xiàng)數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • javascript跟隨滾動(dòng)效果插件代碼(javascript Follow Plugin)

    javascript跟隨滾動(dòng)效果插件代碼(javascript Follow Plugin)

    這篇文章介紹了javascript跟隨滾動(dòng)效果插件代碼(javascript Follow Plugin),有需要的朋友可以參考一下
    2013-08-08
  • 開(kāi)發(fā)中常用的25個(gè)JavaScript單行代碼(小結(jié))

    開(kāi)發(fā)中常用的25個(gè)JavaScript單行代碼(小結(jié))

    這篇文章主要介紹了開(kāi)發(fā)中常用的25個(gè)JavaScript單行代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06

最新評(píng)論

安乡县| 延边| 苍南县| 霍城县| 正蓝旗| 泗水县| 灵台县| 华阴市| 延寿县| 鹤岗市| 富川| 九寨沟县| 岗巴县| 灵山县| 江津市| 浠水县| 陵川县| 白城市| 金湖县| 乐都县| 汝南县| 军事| 鄂温| 镇远县| 长岛县| 志丹县| 鲁甸县| 松原市| 美姑县| 朔州市| 平乐县| 沙坪坝区| 济宁市| 麦盖提县| 定南县| 罗甸县| 平遥县| 东海县| 洪湖市| 射洪县| 镇安县|