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