JS非同步調控器
阿新 • • 發佈:2021-02-04
技術標籤:面試真題前端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');