如何在JavaScript中实现sleep函数?为何我的循环实现致页面崩溃?
为什么你的sleep代码会导致网站崩溃?
先拆解你代码里的几个关键问题:
- 你写的
d.getSeconds是函数本身,不是调用函数获取当前秒数,必须加括号写成d.getSeconds()才行。不然oldTime存的是函数引用,后面计算差值时根本不是数字,永远不可能等于seconds。 - 就算补上括号,
d是一开始创建的固定Date对象,它的秒数不会自动更新,循环里每次取的都是同一个值,差值永远是0,循环永远跳不出去,直接变成死循环。 - 这种同步的while死循环会霸占JavaScript的主线程,浏览器完全没法处理其他事件(比如点击、页面渲染),所以网站直接卡死崩溃。
简单易懂的sleep实现方式
给你两种容易理解的实现,都不会卡死页面:
方式1:用setTimeout(异步回调)
这是最基础的写法,让指定代码在延迟后执行:
function sleep(callback, seconds) { // 把秒转成毫秒,因为setTimeout只认毫秒单位 setTimeout(callback, seconds * 1000); } // 用法:2秒后执行括号里的代码 sleep(function() { console.log("2秒到了!"); }, 2);
方式2:用Promise+async/await(像同步代码一样写)
如果不想用回调,这种写法更接近传统sleep的直观逻辑:
function sleep(seconds) { return new Promise(resolve => { setTimeout(resolve, seconds * 1000); }); } // 必须在async函数里使用await async function test() { console.log("开始等待"); await sleep(2); // 等待2秒 console.log("2秒过去了"); } test();
这两种都是异步逻辑,不会霸占主线程,页面还能正常响应操作。
内容的提问来源于stack exchange,提问作者swag money wizz jizz
相关产品推荐
相关产品推荐

