亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript實現(xiàn)控制并發(fā)請求數(shù)量的方法詳解

 更新時間:2024年02月05日 14:33:44   作者:黑土豆  
這篇文章主要為大家詳細介紹了JavaScript如何實現(xiàn)控制并發(fā)請求數(shù)量,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

前言

嗨呀,又是將近一個月沒有更文了,想死你們了!今天又來繼續(xù)我的更文事業(yè),技術的道路注定是要將卷進行到底的!至于這么久才來更文的原因,那自然是沒有好的羊毛值得去薅,一旦有好羊毛那當然是也不會缺席的,所以今天我來了!

這次要分享的主題就是前久飯后在和同事討論時無意間發(fā)現(xiàn)的,那就是前端如何實現(xiàn)并發(fā)請求數(shù)量控制。如果你在實際項目中有過類似的需求,應該不會陌生,反之如果你還沒有且還不了解的話,那你就有必要耐心地看完這篇文章,保證你一定會有所收獲的!

場景

假設有這么一個場景:現(xiàn)在有20個異步請求需要發(fā)送,但是由于某些原因,要求我們必須將同一時刻的并發(fā)請求數(shù)量控制在3個以內,并且還要盡可能快速的拿到響應結果。其實這個場景在一些大廠的面試題中也有過提及,如下:

實現(xiàn)一個并發(fā)請求函數(shù)concurrencyRequest(urls, maxNum),要求如下:

• 要求最大并發(fā)數(shù) maxNum

• 每當有一個請求返回,就留下一個空位,可以增加新的請求

• 所有請求完成后,結果按照 urls 里面的順序依次打出(發(fā)送請求的函數(shù)可以直接使用fetch即可)

遇到到這個問題時你會怎么來做?

遇到這個問題還是先來分析一下這個問題的設計思路→。

設計思路

首先來看將上面的文字轉化為圖之后的效果:

這樣就直觀的看到,有一個最大并發(fā)數(shù)maxNum20個異步請求的urls集合和并發(fā)返回之后的results集合。

下面就開始演示這個思路是如何開始的,如下:

首先按照每次只能并發(fā)3個請求的要求,這里就對應A、B、C,當其中有一個請求完之后就會再從urls里面再取出一個進行請求,這樣依次類推,直到urls里面的20個請求都執(zhí)行完才終止請求。

主要思路就是上面所述,但是在開發(fā)時我們要考慮一些特殊情況,如下:

  • urls的長度為0時,results就沒有值,此時應該返回空數(shù)組
  • maxNum大于urls的長度時,應該取的是urls的長度,否則則是取maxNum
  • 需要定義一個count計數(shù)器來判斷是否已全部請求完成
  • 因為沒有考慮請求是否請求成功,所以請求成功或報錯都應把結果保存在results集合中
  • results中的順序需和urls中的保持一致

好,我的設計思路就是這樣的,下面就要來開始開發(fā)工作啦~

開發(fā)

具體代碼如下(代碼中已備注有注釋):

// 并發(fā)請求函數(shù)
const concurrencyRequest = (urls, maxNum) => {
    return new Promise((resolve) => {
        if (urls.length === 0) {
            resolve([]);
            return;
        }
        const results = [];
        let index = 0; // 下一個請求的下標
        let count = 0; // 當前請求完成的數(shù)量

        // 發(fā)送請求
        async function request() {
            if (index === urls.length) return;
            const i = index; // 保存序號,使result和urls相對應
            const url = urls[index];
            index++;
            console.log(url);
            try {
                const resp = await fetch(url);
                // resp 加入到results
                results[i] = resp;
            } catch (err) {
                // err 加入到results
                results[i] = err;
            } finally {
                count++;
                // 判斷是否所有的請求都已完成
                if (count === urls.length) {
                    console.log('完成了');
                    resolve(results);
                }
                request();
            }
        }

        // maxNum和urls.length取最小進行調用
        const times = Math.min(maxNum, urls.length);
        for(let i = 0; i < times; i++) {
            request();
        }
    })
}

測試

測試代碼如下:

const urls = [];
for (let i = 1; i <= 20; i++) {
    urls.push(`https://jsonplaceholder.typicode.com/todos/${i}`);
}
concurrencyRequest(urls, 3).then(res => {
    console.log(res);
})

結果

下面通過運行代碼來看看效果:

首先來看看控制臺輸出的結果,如下:

可以看到20個請求都請求完成,results里面也是按順序打印出了結果。

然后再看看請求時請求數(shù)量是否每次都是3個,如下:

通過上面這個gif圖可以很直觀的看到,每次請求的數(shù)量都是3個,證明寫的代碼沒有毛病,搞定!

至此,這個在實際開發(fā)中會遇見的前端控制并發(fā)請求的需求就實現(xiàn)完成了。代碼相對來說沒有太大的難度,只要把一些特殊情況給考慮完全,最后的實現(xiàn)也就沒什么太大問題。最后,希望看完這篇文章之后你也能輕松掌握前端控制并發(fā)數(shù)量的問題,栓Q~

以上就是JavaScript實現(xiàn)控制并發(fā)請求數(shù)量的方法詳解的詳細內容,更多關于JavaScript控制并發(fā)請求數(shù)量的資料請關注腳本之家其它相關文章!

相關文章

  • Javascript 命名空間模式

    Javascript 命名空間模式

    命名空間是通過為項目或庫創(chuàng)建一個全局對象,然后將所有功能添加到該全局變量中。通過減少程序中全局變量的數(shù)量,實現(xiàn)單全局變量,從而在具有大量函數(shù)、對象和其他變量的情況下不會造成全局污染,同時也避免了命名沖突等問題
    2013-11-11
  • 微信小程序scroll-view實現(xiàn)左右聯(lián)動效果

    微信小程序scroll-view實現(xiàn)左右聯(lián)動效果

    這篇文章主要為大家詳細介紹了微信小程序scroll-view實現(xiàn)左右聯(lián)動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 使用JavaScript實現(xiàn)檢測網頁是否為空閑狀態(tài)

    使用JavaScript實現(xiàn)檢測網頁是否為空閑狀態(tài)

    最近開發(fā)項目時,常碰到“用戶在一定時間內無任何操作時,跳轉到某個頁面”的需求,所以本文就來使用JavaScript實現(xiàn)這一要求,需要的可以參考下
    2024-03-03
  • 原生JS實現(xiàn)簡單的輪播圖效果

    原生JS實現(xiàn)簡單的輪播圖效果

    這篇文章主要為大家詳細介紹了原生JS實現(xiàn)簡單的輪播圖效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JS簡單測試循環(huán)運行時間的方法

    JS簡單測試循環(huán)運行時間的方法

    這篇文章主要介紹了JS簡單測試循環(huán)運行時間的方法,涉及針對javascript中for循環(huán)、for...in循環(huán)及foreach循環(huán)的相關使用方法及運行時間測試,需要的朋友可以參考下
    2016-09-09
  • JS及PHP代碼編寫八大排序算法

    JS及PHP代碼編寫八大排序算法

    這篇文章主要為大家詳細介紹了JS及PHP代碼編寫八大排序算法的相關資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • JS實現(xiàn)拖動模態(tài)框案例

    JS實現(xiàn)拖動模態(tài)框案例

    這篇文章主要為大家詳細介紹了JS實現(xiàn)拖動模態(tài)框案例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 微信域名檢測接口調用演示步驟(含PHP、Python)

    微信域名檢測接口調用演示步驟(含PHP、Python)

    這篇文章主要介紹了微信域名檢測接口調用演示步驟(含PHP、Python),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • 概述BootStrap中role=

    概述BootStrap中role="form"及role作用角色

    這篇文章主要介紹了BootStrap中role="form"及role作用角色介紹,以及bootstrap柵欄系統(tǒng)css中的col-xs-*,col-sm-*,col-md-* 的意義簡單介紹,需要的朋友參考下
    2016-12-12
  • JavaScript操縱窗口的方法小結

    JavaScript操縱窗口的方法小結

    一旦你得到了表示窗口的變量,你就能通過各種方法來操縱它。下面介紹一下對窗口的各種操作
    2013-06-06

最新評論