JS异步调控器

JS异步调控器

JS异步调控器

题目:

class Scheduler {
	consturctor() {
	}

	add(promiseCreator){
		//...
	}
}

const timer = (time) => {
	return new Promise((resolve, reject) => {
		setTimeout(resolve, time);
	})
}

let scheduler = new Scheduler();

const addTask = (time, data) => {
	scheduler.add(() => timer(time)).then((res) => { console.log(data, res) })
}

addTask(1000, '1');
addTask(500, '2');
addTask(300, '3');
addTask(400, '4');

/*要求: 在500ms的时候打印 2
		在800ms的时候打印 3
		在1000ms的时候打印 1
		在1200ms的时候打印 4
*/

得知题目和要求后,考虑1、2进入队列后,3、4阻塞等待,当其中一个执行完后,3在进入,但需要注意不能阻塞同步代码的执行。下面的具体的代码实现:

class Scheduler {
	consturctor(maxNum) {
		this.num = 0;
		this.maxNum = maxNum;
		this.list = [];
	}

	async add(promiseCreator){
		this.num++;
		if(this.num > this.maxNum) {
			await new Promise((resolve, reject) => {
				this.list(resolve);
			})	
		}

		try {
			let res = await promiseCreator();
			this.num--;
			if(this.list.length > 0) {
				this.list.shift()();
			}
			return res;
		} catch(e) {
			this.num--;
			if(this.list.length > 0) {
				this.list.shift()();
			}
			return Promise.reject(e);
		}
	}
}

const timer = (time) => {
	return new Promise((resolve, reject) => {
		setTimeout(resolve, time);
	})
}

let scheduler = new Scheduler();

const addTask = (time, data) => {
	scheduler.add(() => timer(time))
		.then(res => { console.log(data, res) })
		.catch(e => { console.error('err', e) })
}

addTask(1000, '1');
addTask(500, '2');
addTask(300, '3');
addTask(400, '4');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值