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

由于面试官在国外,遂采用的视频面试。
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

相关推荐

1.互相自我介绍2.项目是自己做的还是哪个公司的项目(答没实习自己做的)遂直接跳过我的项目问基础去了…..(好歹也让我说下我准备的难点亮点啊3.你对前端的理解4.vue的双向绑定原理,能说多少说多少,追问和react的区别,为什么选vue不选react。5.虚拟dom的理解,js操作dom有哪些方法,为什么虚拟dom可以加快渲染速度,从回流与重绘的角度谈谈,再谈谈浏览器是如何渲染dom的(总体来说面试官会从一个常规八股出发根据你的回答深挖)6.为什么浏览器第二次请求页面会比第一次快。答应该是从缓存的角度去思考,再谈谈觉得缓存了什么。既然你提到http缓存那你谈一下整个http缓存过程。怎么才能知道协商缓存过没过期,从服务端的角度去思考一下如何通知用户缓存过期了。(写到这里有点心得,真不是像一些面经说的要一直答,自己一个人疯狂输出,字节的开始官会打断你的技能施法,问她想问的点。所以对于某些面试官八股适可而止就行,背重点最好两句话答完,面试官更想互动。)6.一道题,是变量提升和函数提升的,图在文章底部。7.既然谈到了let那说一下是什么时候出来的,es6还有哪些新东西。map和对象除了key的类型不一样还有啥区别。8.bfc说一下,例子举几个。9.做题三道,一道异步输出题。异步题不仅要写对还要把每个输出你的理由说给她听。刚面试完,靠记忆临时总结一下,具体更多的细节和题目我再去掘金写一篇文章。总结,答得马马虎虎,一次不亏型面试,过了血赚凉了不亏,比上次美团面试答得很好还凉了体验好多了。 #面试#&nbsp;&nbsp;#前端#&nbsp;&nbsp;#字节#
点赞 评论 收藏
转发
11 88 评论
分享
牛客网
牛客企业服务