1. 程式人生 > 其它 >JS非同步調控器

JS非同步調控器

技術標籤:面試真題前端javascriptes6位元組跳動面試

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');