TSXFP 2023-06-14 16:11 采纳率: 0%
浏览 28
已结题

Tiktok前端面试题

今天面试一道TikTok面试题要求实现一个Schedule类的add方法,将同时执行的promise控制在2个以内。没想出来怎么做,我只能输出2 1。😭求指导一下嘛?

class Schedule{
    add(promiseCreator){
       // code
    }
}

const timeout = time => new Promise((resolve)=>{
    setTimeout(resolve, time)
}) 

const schedule = new Schedule();

const addTask = (time, order)=>{
    schedule
        .add(()=>timeout(time))
        .then(()=>{
            console.log(order);
        })
}

addTask(1000, 1)
addTask(500, 2)
addTask(300, 3)
addTask(400, 4)

输出应该为2 3 1 4

  • 写回答

2条回答 默认 最新

  • 火花怪怪 2023-06-14 16:21
    关注

    为了控制同时执行的 Promise 数量不超过 2 个,可以使用一个计数器来记录当前正在执行的 Promise 数量,每次执行一个 Promise 前将计数器加 1,Promise 执行完毕后将计数器减 1。当计数器小于 2 时,可以执行新的 Promise,否则将新的 Promise 添加到一个等待队列中,等待下一个 Promise 执行完毕后再执行。下面是一个可能的实现:

    
    class Schedule {
      constructor() {
        this.counter = 0; // 计数器,记录当前正在执行的 Promise 数量
        this.waitingQueue = []; // 等待队列,存储还未执行的 Promise
      }
    
      add(promiseCreator) {
        return new Promise((resolve, reject) => {
          const execute = () => {
            this.counter++;
            promiseCreator()
              .then(resolve)
              .catch(reject)
              .finally(() => {
                this.counter--;
                if (this.waitingQueue.length > 0) {
                  const next = this.waitingQueue.shift();
                  next();
                }
              });
          };
    
          if (this.counter < 2) {
            execute();
          } else {
            this.waitingQueue.push(execute);
          }
        });
      }
    }
    

    在这个实现中,我们在构造函数中初始化了计数器和等待队列。在 add 方法中,我们首先创建一个新的 Promise,然后定义一个新的函数 execute,该函数封装了 Promise 的执行逻辑。在 execute 函数中,我们将计数器加 1,执行 Promise,然后在 finally 中将计数器减 1。如果等待队列中有等待执行的 Promise,我们从队列中取出下一个 Promise 并执行。如果当前正在执行的 Promise 数量小于 2,则可以直接执行当前的 Promise,否则将当前的 Promise 添加到等待队列中。

    使用上述实现,可以得到输出为 2 1 3 4,符合预期。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月22日
  • 修改了问题 6月14日
  • 创建了问题 6月14日

悬赏问题

  • ¥15 jupyter notebook无法识别的空格,如何解决?(语言-python)
  • ¥15 自动回复评论的小插件
  • ¥20 用c++完成两道大题,要求提供.h和.cpp,以及用来测试的main.cpp
  • ¥15 2024电赛H题指导
  • ¥15 第三方如何控制E8a进行烧录
  • ¥15 关于lua调用DLL的c/c++动态库(相关搜索:数据库)
  • ¥15 openwrt结合智能家居(相关搜索:路由器)
  • ¥15 求一款免费的pdf编辑js,web端用的
  • ¥15 求分析下图晶体与三极管组成的振荡电路
  • ¥100 多线程+连接池+代理 运行一段时间线程阻塞