zoukankan      html  css  js  c++  java
  • js的for循环中出现异步函数,回调引用的循环值始终是最后的值

    一、问题

    今天工作中解决bug发现是由“for循环的异步函数,回调引用的循环值始终是最后的值”的现象导致的,如:

    for (var i = 0; i < files.length; i++) {
        var itemFile = files[i];
        fs.stat("./uploads/" + itemFile, function (err, stats) {    
            if (stats.isDirectory()) {
                console.log(itemFile+i);    
            } else {
                console.log(2);
            }
        });
    }

    输出结果是:

    wedding3
    wedding3
    wedding3

    二、解决方法

    通过自执行函数传参(匿名函数),这样就形成了不受外界变量影响的局部作用域,如:

    for (var i = 0; i < files.length; i++) {
        (function(i){
            var itemFile = files[i];
            fs.stat("./uploads/" + itemFile, function (err, stats) {    
                if (stats.isDirectory()) {
                    console.log(itemFile+i);    
                } else {
                    console.log(2);
                }
            });
        })(i);  
    }

    输出得到:

    cat0
    dog1
    wedding2

    三、其他

    前端页面开发也会碰到类似的问题,比如setTimeout异步执行的问题,在前端可以通过jquery的each方案解决。用jQuery的 $.each(),自带回调函数,形成了函数作用域.

    <script type="text/javascript">
        var arr = ["dog",cat","wedding"];
        $.each(arr, function(key, value) {
            setTimeout(function() {
                console.log(key);
                console.log(value);
            }, 2000);
        });
    </script>

    参照:https://www.cnblogs.com/csuwujing/p/8021913.html

    立即执行函数详解见:https://www.cnblogs.com/vickylinj/p/12191958.html

  • 相关阅读:
    解决express不是内部或外部命令
    spring ioc认识
    Filter编码过滤
    call、apply、bind
    js面向对象浅析
    由clientWidth到document
    401
    删除页面中Form下面隐藏的ViewStatue
    asp.net 下载
    day98
  • 原文地址:https://www.cnblogs.com/vickylinj/p/12024289.html
Copyright © 2011-2022 走看看