滴滴秋招一面
自我介绍。
手写。
🔍 展开代码
jsasync 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); });手写。
🔍 展开代码
jsasync 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();写一个布局,外层 div 里有三个按照对角线排列的 div。要求:外层的 div 没有固定高度。
手写 TupleToUnion。
