详解JavaScript如何控制并发请求数量
作者:gnip
某些情况下,我们可能需要对需要执行的多个异步任务进行异步数量控制,只允许固定数量的任务执行,本文为大家整理了JS控制并发请求数量的相关代码,希望对大家有所帮助
概述
某些情况下,我们可能需要对需要执行的多个异步任务进行异步数量控制,只允许固定数量的任务执行,等待其中某些任务完成后,继续追加异步任务,直到将缓冲队列填满,最后执行完毕再停止。
代码
class BufferControl { bufferList = []; //缓冲队列 maxLen = 1; //当前允许执行的最大并发数量 currentQueenCount = 0; //当前正在执行的任务数量 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秒后执行完毕全部异步任务。
如果我们吧属性maxLen改为2,则会共计耗时2秒完成打印,每秒分别打印两次任务。
总结
当然,异步任务的个数和时间都不定,我们可以根据自己的需求,自行设置,最重要还是对Promise的深入理解.
到此这篇关于详解JavaScript如何控制并发请求数量的文章就介绍到这了,更多相关JavaScript控制并发请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!