如下函数已 10 个并发请求为标准,超过 10 个的部分按调用顺序进行排队,当前一个请求完成时,再发送队列中的下一个请求。数组
function concurrentPoll(){ this.tasks = []; // 任务队列 this.max = 10; // 最大并发数 setTimeout(() => { // 函数主体执行完后当即执行 this.run() },0) } concurrentPoll.prototype.addTask = function(task){ // 原型添加任务方法 this.tasks.push(task) } concurrentPoll.prototype.run = function(){ // 原型任务运行方法 if(this.tasks.length == 0){ // 判断是否还有任务 return } var min = Math.min(this.tasks.length, this.max); // 取任务个数与最大并发数最小值 for(var i = 0; i < min; i++){ this.max--; // 执行最大并发递减 var task = this.tasks.shift(); // 从数组头部取任务 task().then((res) => { // 重:此时可理解为,当for循环执行完毕后异步请求执行回调,此时max变为0 console.log(res) }).catch((err) => { console.log(err) }).finally(() => { // 重:当全部请求完成并返回结果后,执行finally回调,此回调将按照for循环依次执行,此时max为0. this.max++; // 超过最大并发10之后的任务将按照任务顺序依次执行。此处可理解为递归操做。 this.run(); }) }} var poll = new concurrentPoll(); // 实例 for (var i=0; i<13; i++) { // 数据模拟 poll.addTask(function () { return new Promise( function (resolve, reject) { // 一段耗时的异步操做 resolve('成功') // 数据处理完成 // reject('失败') // 数据处理出错 } )}) }