node.js 用函数实现 setTimeout 的效果
· 阅读需 2 分钟
程序中常常有回到一种需求"等一等",就是让当前线程延时等待一下.
之前发过一个帖子就是关于 node.js定时器
setTimeout(function(){
//实现内容
},时间值)
确实可以起到这样的效果,用起来也非常方便,匿名函数里是你的逻辑实现,后面的时间值是多少毫秒.
我们可以自己实现一个方法来模拟setTimeout 函数
function mySetTimeout(ms) {
var currentTime = new Date().getTime();
while (new Date().getTime() < currentTime + ms);
}
如何使用:
console.log("等待开始");
mySetTimeout(20000); //调用函数
console.log("等待结束");
不过这种写法更多适合用来说明原理,而不适合在真实 Node.js 服务里直接使用。原因很简单:它是一个忙等待,会一直占着 CPU 不放,期间事件循环也无法正常处理其他任务。也就是说,看起来像“等一等”,实际上是在用最昂贵的方式硬把线程卡住。
为什么官方的 setTimeout 更合理
因为真正的定时器并不是靠 while 循环在那里死等,而是把回调交给事件循环,在时间到了之后再调度执行。这样等待期间,进程仍然可以继续处理别的 I/O 或回调任务。这也是 Node.js 异步模型最有价值的地方之一。
所以这段自定义函数更像一个“反向示例”:它有助于理解延时效果的表象,但真正写业务时,还是应该回到事件循环友好的原生定时器实现上。
从学习角度看,这种“自己先粗暴模拟一遍,再去理解官方实现为什么更优”的过程其实很有价值。它会让你更清楚地感受到 Node.js 的优势不只是 API 好用,而是整套事件循环和异步调度模型在背后提供了更合理的执行方式。
也正因为这样,很多看起来“我自己也能写一个”的功能,在真正放到运行时环境里时,差别其实非常大。理解原理很好,但最终还是要尊重运行时的设计边界。这种分寸感,也是从简单示例过渡到工程实践时很重要的一课。
