字节跳动前端社招一面面经

由于面试官在国外,遂采用的视频面试。
1.自我介绍;
2.职业规划;
3.为什么选择字节跳动;
4.最近的项目中有什么是你优化的地方。
5.编程题:
JS实现一个带并发限制的异步调度器Scheduler,保证同时运行的任务最多有两个。完善代码中Scheduler类,使得以下程序能正确输出。
class Scheduler {
  add(promiseCreator) { ... }
  // ...}const timeout = (time) => new Promise(resolve => {
  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.list = [];
    this.count = 0;
  }
  add(promiseCreator) {
    return new Promise(resolve => {
      // 加入任务队列
      this.list.push(() => {
        resolve(Promise.resolve(promiseCreator()).then(s => {
          // 当前任务结束后,执行下一个任务
          this.count--;
          this.start();
          return s
        }));
      });
      // 执行当前任务
      this.start();
    })
  }

  start () {
    // 最多两个同时进行的任务
    if (this.count < 2) {
      this.count++;
      this.list[0] && this.list[0]();
      this.list.shift();
    }
  }
}
const timeout = (time) => new Promise(resolve => {
  setTimeout(resolve, time)
})
const scheduler = new Scheduler();

const addTask = (time, order) => {
  scheduler.add(() => timeout(time)).then(() => console.log(time, 'time, order', 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
很遗憾代码没有通过用例,不知道哪里出错了😭,能否有大神指点下,让我死明白。

#面经##社招##字节跳动##前端工程师#
全部评论
应该没错吧。。。。。 //promise版     add(promiseCreator){         let content = this;             return new Promise((resolve,reject)=>{                 if(content.limit > 0){                     content.limit--;                     resolve(promiseCreator());                 }else{                     content.arr.push([resolve,promiseCreator]);                 }             }).then(()=>{                 if(content.arr.length){                     let item = content.arr.shift();                     item[0](item[1]());                 }else{                     content.limit++;                 }                 return Promise.resolve();             })         } //await版     async add(promiseCreator) {          if(this.limit<=0){              await new Promise((resolve)=>{                     this.arr.push(resolve);             })         }         this.limit--;         await promiseCreator();         this.limit++;                  if(this.arr.length) this.arr.shift()();     }
2 回复
分享
发布于 2021-02-25 19:28
边收集边执行,在任务完成回调之前,最多只能有两个 class Scheduler {     constructor() {         this.taskArr = []         this.count = 0     }     add(promiseCreator) {         return new Promise((resolve, reject) => {             this.taskArr.push({promiseCreator, resolve})             this.run()         })     }     run() {         if(this.taskArr.length && this.count < 2) {             this.count ++             let {promiseCreator, resolve} =  this.taskArr.shift()             Promise.resolve(promiseCreator()).then(() => {                 resolve()                 this.count --                 this.run()             })         }     } } const timeout = (time) => new Promise(resolve => {   setTimeout(resolve, time) }) const scheduler = new Scheduler() const addTask = (time, order) => {   scheduler.add(() => timeout(time))     .then(() => console.log(order)) } addTask(1000, '1') addTask(500, &(11526)#39;2') addTask(300, &(11527)#39;3') addTask(400, &(11528)#39;4')
2 回复
分享
发布于 2021-02-27 15:56
百信银行
校招火热招聘中
官网直投
题目里的入队出队有指定, 你的明显不符合啊
1 回复
分享
发布于 2021-07-16 14:39
测了一下,给的那个用例是能通过的。。
点赞 回复
分享
发布于 2021-02-25 10:18
class Scheduler {     constructor() {         this.count = 0         this.waitQueue = [];     }     add(promiseCreator) {         if (this.count < 2) {             this.count += 1;             return this.run(promiseCreator)         } else {             return new Promise(resolve => {                 this.waitQueue.push(() => promiseCreator().then(resolve));             })         }     }     run(promiseCreator) {         return promiseCreator().then(() => {             this.count -= 1;             if (this.waitQueue.length) {                 this.run(this.waitQueue.shift())             }         });     } }
点赞 回复
分享
发布于 2021-03-07 14:01
没错啊 但没必要return s 也没必要promise.resolve()
点赞 回复
分享
发布于 2021-04-07 17:01
class Scheduler {     constructor() {         this.queue = [];         this.curQue = 0;     }     add(promiseCreator) {         let resolve;         const promise = new Promise(res => {             resolve = res;         });         promise.resolve = resolve;         this.queue.push({ promiseCreator, promise });         this.doTask();         return promise;     }     doTask() {         if (this.queue.length == 0) return;         if (this.curQue < 2) {             this.curQue++;             const obj = this.queue.shift();             const { promiseCreator, promise } = obj;             promiseCreator().then(() => {                 promise.resolve();                 this.curQue--;                 this.doTask();             });         }     } } 感觉我这个比较好理解
点赞 回复
分享
发布于 2021-08-31 23:34
点赞 回复
分享
发布于 2022-01-04 23:07
字节写code用什么代码编辑器,什么平台
点赞 回复
分享
发布于 2022-01-14 20:08

相关推荐

点赞 评论 收藏
转发
11 88 评论
分享
牛客网
牛客企业服务