JavaScript 如何设置时间限制,终止无限运行的 while 死循环
问题原因
JavaScript是单线程事件驱动运行模型,同步代码的执行优先级始终高于异步任务:
你写的同步while循环会一直占用主线程资源,只有当这个循环执行结束后,事件循环才会调度处理消息队列里的setTimeout回调。但你的循环判断条件依赖setTimeout修改的变量,形成死锁,回调永远不会触发。
修复方案
把同步循环改成异步执行的逻辑,每次循环后让出主线程,给异步回调执行的机会:
let a = true setTimeout(() => { a = false }, 2000) // 用递归异步调用替代同步while循环 function asyncLoop() { if (!a) return console.log('While Loop') // 下一次循环放到消息队列末尾,让出主线程 setTimeout(asyncLoop, 0) } asyncLoop()
如果是Node.js环境,也可以把setTimeout(asyncLoop, 0)替换为setImmediate(asyncLoop),调度效率更高。如果需要控制循环的执行频率,调整setTimeout的第二个参数即可,比如设置为10就可以控制每秒大概执行100次循环。
内容的提问来源于stack exchange,提问作者Kartik Aggarwal
相关产品推荐
相关产品推荐

