一、背景 最近在写一个批量上传的 node 脚本,其实大家可以想到批量上传带来的接口性能问题,如果将需要上传的文件通过多个异步请求同时上传的话,服务器方面应该是吃不消的,所以这里提出一个 promis
class PromisePool extends EventEmitter {
constructor(params,fn,max) {
super();
this.params = params; // 异步函数的参数数组
this.fn = fn; // 异步函数
this.max = max; // 同时运行的最大数量
this.pool = []; // 存放task
this.successNum = 0; // 成功个数
this.failNum = 0; // 失败个数
this.count = params.length; // 当前正在运行的异步函数个数
this.init();
}
// 初始化函数
init() {
while (this.count < this.max) {
const param = this.params.shift();
if(!param){ break; }
this.genTask(param);
}
}
genTask(param) {
this.count++;
const task = this.fn(param);
task.then(() => {
this.successNum++;
}).catch(() => {
this.failNum++;
}).finally(() => {
this.count--;
this.init();
if(this.count === 0 && this.params.length === 0){
this.emit('finish');
}
})
}
}