js中for循环实现sleep阻塞机制

js中for循环实现sleep阻塞,一开始写法:

for(var i=0;i<a.length;i++){
    var id_value = a[i];
    var typeid =$("#aid_"+id_value).data('typeid');
    if ((i+1) == a.length){
        last = true;
    }
    sleep(500)
}

那js怎么解决事件阻塞呢?

关于js的阻塞机制,可以看下面一段代码,一般,我们会认为,这段代码会log出来0,1,2

for(var i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log(i);
    }, (i + 1) * 1000);
}

而实际上,这段代码log出来的结果是 3,3,3。这是js新手很容易遇到的问题,具体原因就是因为for循环的阻塞机制。在上面的代码中,setTimeout这个定时器需要等待for循环 执行完成,而for循环执行完成了之后,i已经为3了,此时才开始执行setTimeout,因此console.log(i)会是3。

至于为什么i会是3,请回顾一下for循环的执行顺序,当i为2的时候,满足循环条件,执行代码块,然后i++,此时i为3,不满足循环条件,不执行代码块,循环停止。

对于for循环,记住,是在不满足条件的情况下停止循环,对于以上代码,可以看出,i=3的时候才不满足。

其实,阻塞作为js引擎的处理方式,我们最好不要想着解决“阻塞”,而是让我们想执行的代码,插入到“主线程”中。这么说比较不易理解,还是以上面的代码为例,直接上代码好了

for(var i = 0; i < 3; i++) {
    (function(i) {
        setTimeout(function() {
            console.log(i);
        }, (i + 1) * 1000);
    })(i)
}

再上面的代码中,我们加了一个立即执行的匿名函数,并且将for循环的i作为实参传入进去。这样,setTimeout就会被立即执行,而不会等待(这里不太了解细节,就不多说了,大概猜测为新开了一个临时的线程,立即执行匿名函数,然后再立即切换回来)。

根据这个原理,修改代码如下:

for(var i=0;i<a.length;i++){
    var id_value = a[i];
    var typeid =$("#aid_"+id_value).data('typeid');
    if ((i+1) == a.length){
        last = true;
    }
    (function (i,id_value,typeid,last){
        setTimeout(function (){
            up_html(id_value,typeid,last);
        },(i+1)*500)
    })(i,id_value,typeid,last)
}

就实现了想要的效果。

出处:www.l1mn.com

原文标题:js中for循环实现sleep阻塞机制

原文地址:https://www.l1mn.com/p/2ho4i2.html

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

评论

皖ICP备2023023451号

Copyright © L1MN.COM 联系方式:l1mnfw@163.com