带布尔中断条件的while循环内使用setTimeout填充数组报错如何解决
报错原因分析
- 第一个触发报错的点是你定义的立即执行函数表达式(IIFE)没有执行:你写了
(function (i) { ... })但末尾没有加()调用这个函数,这段代码仅声明了一个匿名函数却没有任何调用操作,属于未被使用的表达式,因此触发语法提示错误。 - 第二个触发报错的点是
setTimeout的回调逻辑存在语法问题:你在回调函数中仅写了fill,既没有调用fill(),也没有直接将fill作为回调函数传入,同样属于无意义的表达式声明,没有实际执行逻辑。
实现思路问题
你的实现思路完全不可行,核心问题在于:while是同步执行逻辑,而setTimeout是异步宏任务,所有定时器的回调都会等到同步代码执行完毕后才会执行。也就是说你的循环会在主线程同步反复执行i = state.cache.indexOf(""),但同步阶段fill函数永远不会被调用,数组中的空值永远不会被填充,i永远不等于-1,会直接造成主线程无限循环卡死。即使你修正了语法错误,所有定时器也会在同步循环阶段一次性全部注册,最终1秒后所有fill同时触发,根本达不到间隔1秒填充一个的效果。
正确实现方案
采用递归调用的方式替代同步循环,每次填充完成后间隔1秒再检查是否存在空值,决定是否继续执行:
var fillCache = function () { // 检查是否还有空值,没有则终止逻辑 const emptyIndex = state.cache.indexOf("") if (emptyIndex === -1) return // 执行当前次填充 fill() // 间隔1秒后递归调用,执行下一次检查与填充 setTimeout(fillCache, 1000) } // 启动填充逻辑 fillCache()
内容的提问来源于stack exchange,提问作者Gustavo
相关产品推荐
相关产品推荐

