为何Date.now()未按预期执行?自定义sleep函数耗时远超预期
问题原因解析
你的代码里的sleep函数是同步阻塞的死循环,导致实际耗时远超预期的核心原因有两点:
- JavaScript是单线程语言,主线程会被这个while循环完全占用,只有等循环彻底结束,才会去执行后面的
bar()。 - 你设定的
3 * 1000是循环结束的时间阈值,但循环里一直在反复调用foo(),foo()中的console.log('foo')属于IO操作,每次执行都要消耗额外时间。原本空转的while循环可能确实会在3秒左右结束,但加上频繁的console.log输出后,每一轮循环的耗时都被拉长,最终导致整个循环跑完的总时间远超设定的3秒,也就出现了耗时约50秒才执行bar()的情况。
如果要实现延迟执行的需求,完全不应该用这种同步阻塞的写法,JavaScript里有专门的异步API可以实现,比如setTimeout,示例如下:
function sleep(callback, delay) { setTimeout(callback, delay); } function foo() { console.log('foo'); } function bar() { console.log('bar'); } // 这样foo会在3秒后执行,bar会立刻执行 sleep(foo, 3 * 1000); bar();
如果需要bar()在3秒后和foo()先后执行,可以用Promise配合async/await:
function sleep(delay) { return new Promise(resolve => setTimeout(resolve, delay)); } async function run() { await sleep(3 * 1000); console.log('foo'); console.log('bar'); } run();
内容的提问来源于stack exchange,提问作者Alpaca
相关产品推荐
相关产品推荐

