通用协作规范
多人协作规范
本文转载自掘金,原文章地址 https://juejin.cn/post/7011400717843824654
/**
* 编写一个异步任务调度器
*/
class Scheduler {
list = []; //用来承载还未执行的异步
count = 0; //用来计数
constructor(num) {
this.num = num; //允许同时运行的异步函数的最大个数
}
async add(fn) {
// 锁
if (this.count >= this.num) {
await new Promise((resolve) => {
this.list.push(resolve);
});
}
this.count++;
console.log('fn before executed');
const result = await fn();
console.log('fn executed');
this.count--;
console.log('%c this.list.length %s', 'color: #bfffc8', this.list.length);
// 如果有任务完成 则后面排队接上
if (this.list.length > 0) {
console.log('this.list.shift()();');
this.list.shift()();
}
return result;
}
}
const schedule = new Scheduler(3); //最多同一时间让它执行3个异步函数
const asyncFactory = (n, time) => {
return () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(n);
}, time);
});
};
};
schedule.add(asyncFactory(1, 2000)).then((n) => {
console.log(`异步任务:${n}`);
});
schedule.add(asyncFactory(2, 2000)).then((n) => {
console.log(`异步任务:${n}`);
});
schedule.add(asyncFactory(3, 2000)).then((n) => {
console.log(`异步任务:${n}`);
});
schedule.add(asyncFactory(4, 2000)).then((n) => {
console.log(`异步任务:${n}`);
});
schedule.add(asyncFactory(5, 2000)).then((n) => {
console.log(`异步任务:${n}`);
});
schedule.add(asyncFactory(6, 2000)).then((n) => {
console.log(`异步任务:${n}`);
});