js实现异步任务调度器

需求:

  实现一个异步调度器函数,能够不断的将异步执行的函数加入其中,但是它最多能控制同一时间只能执行3个异步函数,并将执行结果返回.

 

核心代码:

/**
 * 编写一个异步任务调度器
 */
class Scheduler {

  list = [];//用来承载还未执行的异步

  count = 0; //用来计数

  constructor(num) {
    this.num = num; //允许同时运行的异步函数的最大个数
  }

  async add(fn) {

    this.count >= this.num ? await new Promise((resolve) => { this.list.push(resolve) }) : "";

    this.count++;

    const result = await fn();

    this.count--;

    if (this.list.length > 0) {
      this.list.shift()();
    }

    return result;

  }

}

module.exports = Scheduler;

 

测试代码:

const Scheduler = require("./index");

const schedule = new Scheduler(3);//最多同一时间让它执行3个异步函数

const asyncFacotory = (n, time) => {

  return () => {

    return new Promise((resolve) => {

      setTimeout(() => {
        resolve(n);
      }, time)

    })

  }

}

schedule.add(asyncFacotory(1, 2000)).then((n) => { console.log(`异步任务:${n}`) });
schedule.add(asyncFacotory(2, 2000)).then((n) => { console.log(`异步任务:${n}`) });
schedule.add(asyncFacotory(3, 2000)).then((n) => { console.log(`异步任务:${n}`) });
schedule.add(asyncFacotory(4, 2000)).then((n) => { console.log(`异步任务:${n}`) });
schedule.add(asyncFacotory(5, 2000)).then((n) => { console.log(`异步任务:${n}`) });
schedule.add(asyncFacotory(6, 2000)).then((n) => { console.log(`异步任务:${n}`) });

 

执行结果:

 

 

分析:1,2,3会同时输出,过2s后又会同时输出4,5,6.最需要引起注意的便是类Scheduler中的add方法中的第一句,通过await阻塞Promise但是又不执行resolve,而是将resolve保存到数组当中去,这样就达到了当异步任务超过3个时线程就会阻塞在第一行.每执行完一个异步任务就会去数组中查看一下有没有还处于阻塞当中的异步任务,如果有的话就执行最前面的那个异步任务.

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值