前端js使用for进行setTimeout延迟操作

最初想着普通for循环根据时间延迟进行调用方法,能达到依次进行,但是结果是执行了同样的参数方法N遍。

let mm =1000;

for (let i in this.man.lamp) {
setTimeout(function() {
this.turnLamp(i,1);
}, mm+100);
}

原因就是因为for循环的阻塞机制。在上面的代码中,setTimeout这个定时器需要等待for循环 执行完成,而for循环执行完成了之后,i已经是最后的值了,此时才开始执行setTimeout,因此会出现同样结果。

 

怎么解决事件阻塞

其实,阻塞作为js引擎的处理方式,我们最好不要想着解决“阻塞”,而是让我们想执行的代码,插入到“主线程”中。

let tim = 2000;
for (let i in this.man.lamp) {
let that = this;
(function(i) {
tim = tim+500;
setTimeout(function() {
that.turnLamp(i,1);
}, tim);
tim = tim+500;
setTimeout(function() {
that.turnLamp(i,0);
}, tim);
})(i)
}

for循环中执行函数将i作为参数传入进去,这样settimeout就会立即执行而不会等待for循环结束

 

posted @ 2020-04-23 16:43  教练我想打篮球  阅读(1355)  评论(0编辑  收藏  举报