詳解JavaScript如何控制并發(fā)請(qǐng)求數(shù)量
概述
某些情況下,我們可能需要對(duì)需要執(zhí)行的多個(gè)異步任務(wù)進(jìn)行異步數(shù)量控制,只允許固定數(shù)量的任務(wù)執(zhí)行,等待其中某些任務(wù)完成后,繼續(xù)追加異步任務(wù),直到將緩沖隊(duì)列填滿,最后執(zhí)行完畢再停止。
代碼
class BufferControl { bufferList = []; //緩沖隊(duì)列 maxLen = 1; //當(dāng)前允許執(zhí)行的最大并發(fā)數(shù)量 currentQueenCount = 0; //當(dāng)前正在執(zhí)行的任務(wù)數(shù)量 add(fn) { this.bufferList.push(fn); this.run(); } run() { if (!this.bufferList.length) { return; } while (this.bufferList.length && this.currentQueenCount < this.maxLen) { let fn = this.bufferList.shift(); this.currentQueenCount++; fn().then(() => { this.currentQueenCount--; this.run(); }); } } } let queen = new BufferControl(); // 定義幾個(gè)異步任務(wù) let fn1 = () => { return new Promise((resolve) => { setTimeout(() => { console.log('fn1', 1000); resolve(); }, 1000); }); }; let fn2 = () => { return new Promise((resolve) => { setTimeout(() => { console.log('fn2', 2000); resolve(); }, 1000); }); }; let fn3 = () => { return new Promise((resolve) => { setTimeout(() => { console.log('fn3', 3000); resolve(); }, 1000); }); }; let fn4 = () => { return new Promise((resolve) => { setTimeout(() => { console.log('fn4', 4000); resolve(); }, 1000); }); }; // 追加到緩沖隊(duì)列中 queen.add(fn1); queen.add(fn2); queen.add(fn3); queen.add(fn4);
效果
最后的效果為每隔1秒打印一次異步任務(wù)的結(jié)果,4秒后執(zhí)行完畢全部異步任務(wù)。
如果我們吧屬性maxLen改為2,則會(huì)共計(jì)耗時(shí)2秒完成打印,每秒分別打印兩次任務(wù)。
總結(jié)
當(dāng)然,異步任務(wù)的個(gè)數(shù)和時(shí)間都不定,我們可以根據(jù)自己的需求,自行設(shè)置,最重要還是對(duì)Promise的深入理解.
到此這篇關(guān)于詳解JavaScript如何控制并發(fā)請(qǐng)求數(shù)量的文章就介紹到這了,更多相關(guān)JavaScript控制并發(fā)請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一個(gè)獲取第n個(gè)元素節(jié)點(diǎn)的js函數(shù)
這篇文章主要介紹了一個(gè)獲取第n個(gè)元素節(jié)點(diǎn)的js函數(shù),功能還不完善 ,需要的朋友可以參考下2014-09-09javascript檢查表單數(shù)據(jù)是否改變的方法
需要檢查用戶是否修改了一個(gè)表單中的內(nèi)容,可以使用本文提供的方法,如果修改了表單的內(nèi)容則返回true,沒(méi)修改則返回false,有需求的朋友可以參考下2013-07-07javascript中函數(shù)作為參數(shù)調(diào)用的方法
這篇文章主要介紹了javascript中函數(shù)作為參數(shù)調(diào)用的方法,實(shí)例分析了函數(shù)作為操作調(diào)用的原理與相關(guān)技巧,需要的朋友可以參考下2015-02-02JavaScript獲取當(dāng)前運(yùn)行腳本文件所在目錄的方法
這篇文章主要介紹了JavaScript獲取當(dāng)前運(yùn)行腳本文件所在目錄的方法,涉及JavaScript文件目錄操作的相關(guān)技巧,需要的朋友可以參考下2016-02-02javascript基于定時(shí)器實(shí)現(xiàn)進(jìn)度條功能實(shí)例
這篇文章主要介紹了javascript基于定時(shí)器實(shí)現(xiàn)進(jìn)度條功能,簡(jiǎn)單分析了javascript定時(shí)器的功能、使用方法并給出了基于定時(shí)器實(shí)現(xiàn)的進(jìn)度條功能實(shí)例,需要的朋友可以參考下2017-10-10JS關(guān)閉窗口與JS關(guān)閉頁(yè)面的幾種方法小結(jié)
本篇文章要是對(duì)JS關(guān)閉窗口與JS關(guān)閉頁(yè)面的幾種方法進(jìn)行了總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12