如何实现 Promise 池

前端开发 作者: 2024-08-20 06:50:01
一、背景 最近在写一个批量上传的 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');
      }
    })
  }
}
原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_65378.html
如何实现 Promise 池