看到一个面试题
“`
testFunc() {
console.log(“要求这句话立即输出”,new Date());
setTimeout(()=>{console.log(“要求这句话 3 秒后输出”,new Date());},1);
// todo:要求不改动上面代码,这行后面写一段代码完成上面的需求。
}
不可能同步地卡线程 3 秒
接下来给出一个帅气的答案:
async function sleepSync(n) { return new Promise(resolve => setTimeout(() => resolve(), n)); }
async function task() {
await sleepSync(3000);
return 1;
}
否则在 javascript 里面,很难 block 主线程
这个可以根据变量提升原则来实现:
console.log(“要求这句话立即输出”,new Date());
setTimeout(()=>{console.log(“要求这句话 3 秒后输出”,new Date());},1);
// todo:要求不改动上面代码,这行后面写一段代码完成上面的需求。
function setTimeout(func) {
globalThis.setTimeout(func, 3000);
}
简单来说,把
A 调用函数 B,改为
A 调用框架 B 。并且把调用过程,改为 2 个过程:
1.A 调用框架 B,并且发送参数、处理函数与回调函数。
2.框架 B 开始执行处理函数,执行完毕后,开发可以利用任何方法,延迟 3 秒。
3.延迟 3 秒后,框架 B 执行回调函数来通知 A 。
4.在 2 与 3 之间,甚至 A 还可以调用框架 B,来查询处理进度。
js 里没法实现 sleep 吗?
而这里题目不允许修改函数返回值,也就不能异步,必须同步实现,只能用死循环阻塞住同步任务
本质上不是问生产代码怎么写,而是加个不必要的预设,逼你用些奇技淫巧,目的是考察对任务调度的理解