头条前端 二面程序题

class Scheduler {
    add(promiseCreator) { // 需要实现 }
} const timeout = (time) => new Promise(resolve => { console.log('in timeout:', time);
    setTimeout(resolve, time)
}); const scheduler = new Scheduler(); const addTask = (time, order) => {
    scheduler.add(() => timeout(time))
             .then(() => console.log(order))
};
addTask(1000, '1')
addTask(500, '2')
addTask(300, '3')
addTask(400, '4') // output: 2 3 1 4 // 一开始,1、2 两个任务进入队列 // 500ms 时,2 完成,输出 2,任务 3 进队 // 800ms 时,3 完成,输出 3,任务 4 进队 // 1000ms 时,1 完成,输出 1 // 1200ms 时,4 完成,输出 4 
题目要求任务并行完成,同时并行的任务不能超过两个。
面试官人超好,一直在引导我,奈何我太菜,求大佬讲解一下这道题。
#笔试题目##字节跳动#
全部评论
class Scheduler { constructor() { this.cur = 0; this.prepare = []; } run() { if (this.prepare.length == 0) return; const [task, resolve] = this.prepare.shift(); this.cur += 1; task().then(_ => { this.cur -= 1 resolve(); this.run(); }) } add(promiseCreator) { return new Promise((res, rej) => { this.prepare.push([promiseCreator, res]); if (this.cur < 2) { this.run(); } }) } } const timeout = (time) => new Promise(resolve => { console.log("in timeout:", time); setTimeout(resolve, time) }); const scheduler = new Scheduler(); const addTask = (time, order) => { scheduler.add(() => timeout(time)) .then(() => console.log(order)) }; addTask(1000, '1') addTask(500, '2') addTask(300, '3') addTask(400, '4') addTask(100, '5') // output: 2 3 1 5 4 // 一开始,1、2两个任务进入队列 // 500ms时,2完成,输出2,任务3进队 // 800ms时,3完成,输出3,任务4进队 // 1000ms时,1完成,输出1,任务5进队 // 1100ms时,5完成,输出5 // 1200ms时,4完成,输出4
3 回复 分享
发布于 2019-07-18 21:54
可以了,还有一个问题,为什么in time out:400先于3输出? class Scheduler { race() { return Promise.race([...this.main]).then(() => { // console.log(`main size ${this.main.size}`) if (this.main.size < 2) { let willRun = this.queue.shift()(); this.main.add(willRun); willRun.then(() => { this.main.delete(willRun); }); return willRun } else { console.log('have to wait') return this.race(); } }); } add(promiseCreator) { if (this.queue === undefined) this.queue = []; if (this.main === undefined) this.main = new Set(); this.queue.push(promiseCreator); if (this.queue.length && this.main.size < 2) { let willRun = this.queue.shift()(); this.main.add(willRun); willRun.then(() => { this.main.delete(willRun); }); return willRun; } else { return this.race(); } } } const timeout = time => new Promise(resolve => { console.log("in timeout:", time); setTimeout(() => { resolve(); //console.log(`${time}timeout`); }, time); }); const scheduler = new Scheduler(); const addTask = (time, order) => { scheduler.add(() => timeout(time)).then(() => console.log(order)); }; addTask(1000, "1"); addTask(500, "2"); addTask(300, "3"); addTask(400, "4"); // output: 2 3 1 4 // 一开始,1、2 两个任务进入队列 // 500ms 时,2 完成,输出 2,任务 3 进队 // 800ms 时,3 完成,输出 3,任务 4 进队 // 1000ms 时,1 完成,输出 1 // 1200ms 时,4 完成,输出 4
点赞 回复 分享
发布于 2019-07-18 14:08
pv操做吧
点赞 回复 分享
发布于 2019-07-17 23:24
有点思路了,睡觉了,明天试着写下,可行就发上来
点赞 回复 分享
发布于 2019-07-17 23:17
只能写在函数里边吗?类不能动?
点赞 回复 分享
发布于 2019-07-17 23:06

相关推荐

04-18 15:58
已编辑
门头沟学院 设计
kaoyu:这一看就不是计算机的,怎么还有个排斥洗碗?
点赞 评论 收藏
分享
05-12 22:16
已编辑
北京邮电大学 研发工程师
牛客302360988号:0offer+1 滴滴都不给我面 佬没投鹅吗,鹅应该很喜欢北邮吧
投递美团等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
32
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务