Skip to content

滴滴秋招一面

  1. 自我介绍。

  2. 手写。

    🔍 展开代码
    1.js
    js
    async function runWithConcurrency(tasks, n) {
      const results = [];
      let index = 0; // 当前要取的任务下标
    
      // 运行一个任务
      async function run() {
        if (index >= tasks.length) return;
        const cur = index++;
        try {
          results[cur] = await tasks[cur]();
        } finally {
          // 一个任务结束后,立刻补下一个
          await run();
        }
      }
    
      // 先启动 n 个并发
      await Promise.all(Array.from({ length: n }, run));
      return results;
    }
    // 模拟一堆异步任务
    function createTask(id, ms) {
      return () =>
        new Promise((res) => {
          setTimeout(() => {
            console.log("done", id);
            res(id);
          }, ms);
        });
    }
    
    const tasks = [
      createTask(1, 1000),
      createTask(2, 500),
      createTask(3, 300),
      createTask(4, 400),
      createTask(5, 700),
    ];
    
    runWithConcurrency(tasks, 2).then((res) => {
      console.log("all done", res);
    });
  3. 手写。

    🔍 展开代码
    2.js
    js
    async function mw1(ctx, next) {
      console.log("before middleware 1");
      await next();
      console.log("after middleware 1");
    }
    
    async function mw2(ctx, next) {
      console.log("before middleware 2");
      await next();
      console.log("after middleware 2");
    }
    
    async function mw3(ctx, next) {
      console.log("before middleware 3");
      await next();
      console.log("after middleware 3");
    }
    
    mws = [mw1, mw2, mw3];
    
    function compose(middlewares) {
      return function (context) {
        let index = -1;
    
        function dispatch(i) {
          if (i <= index)
            return Promise.reject(new Error("next() called multiple times"));
          index = i;
          let cur = middlewares[i];
          if (!cur) return Promise.resolve();
          return Promise.resolve(
            cur(context, function next() {
              return dispatch(i + 1);
            }),
          );
        }
    
        return dispatch(0);
      };
    }
    
    fn = compose(mws);
    fn();
  4. 写一个布局,外层 div 里有三个按照对角线排列的 div。要求:外层的 div 没有固定高度。

  5. 手写 TupleToUnion。