詳解JavaScript如何控制并發(fā)請求數(shù)量
概述
某些情況下,我們可能需要對需要執(zhí)行的多個異步任務進行異步數(shù)量控制,只允許固定數(shù)量的任務執(zhí)行,等待其中某些任務完成后,繼續(xù)追加異步任務,直到將緩沖隊列填滿,最后執(zhí)行完畢再停止。
代碼
class BufferControl {
bufferList = []; //緩沖隊列
maxLen = 1; //當前允許執(zhí)行的最大并發(fā)數(shù)量
currentQueenCount = 0; //當前正在執(zhí)行的任務數(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();
// 定義幾個異步任務
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秒完成打印,每秒分別打印兩次任務。
總結
當然,異步任務的個數(shù)和時間都不定,我們可以根據(jù)自己的需求,自行設置,最重要還是對Promise的深入理解.
到此這篇關于詳解JavaScript如何控制并發(fā)請求數(shù)量的文章就介紹到這了,更多相關JavaScript控制并發(fā)請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
如何用JS/HTML將時間戳轉(zhuǎn)換為“xx天前”的形式
如果我們有一份過去時間戳,如何使用JS/HTML將時間戳轉(zhuǎn)換為“xx天前”的形式呢?很多朋友都覺得解決辦法有點困難,其實很簡單的,下面小編給大家分享完整的實現(xiàn)代碼,一起看看吧2017-02-02
微信小程序?qū)崿F(xiàn)客服功能(客服消息)的全過程
在最近做的微信小程序中需要實現(xiàn)一個自帶的客服功能,下面這篇文章主要給大家介紹了關于微信小程序?qū)崿F(xiàn)客服功能(客服消息)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-12-12

