詳解JavaScript如何控制并發(fā)請求數量
更新時間:2024年01月15日 09:38:10 作者:gnip
某些情況下,我們可能需要對需要執(zhí)行的多個異步任務進行異步數量控制,只允許固定數量的任務執(zhí)行,本文為大家整理了JS控制并發(fā)請求數量的相關代碼,希望對大家有所幫助
概述
某些情況下,我們可能需要對需要執(zhí)行的多個異步任務進行異步數量控制,只允許固定數量的任務執(zhí)行,等待其中某些任務完成后,繼續(xù)追加異步任務,直到將緩沖隊列填滿,最后執(zhí)行完畢再停止。
代碼
class BufferControl {
bufferList = []; //緩沖隊列
maxLen = 1; //當前允許執(zhí)行的最大并發(fā)數量
currentQueenCount = 0; //當前正在執(zhí)行的任務數量
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();
// 定義幾個異步任務
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);
});
};
// 追加到緩沖隊列中
queen.add(fn1);
queen.add(fn2);
queen.add(fn3);
queen.add(fn4);
效果
最后的效果為每隔1秒打印一次異步任務的結果,4秒后執(zhí)行完畢全部異步任務。

如果我們吧屬性maxLen改為2,則會共計耗時2秒完成打印,每秒分別打印兩次任務。
總結
當然,異步任務的個數和時間都不定,我們可以根據自己的需求,自行設置,最重要還是對Promise的深入理解.
到此這篇關于詳解JavaScript如何控制并發(fā)請求數量的文章就介紹到這了,更多相關JavaScript控制并發(fā)請求內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

