【问题标题】:variables are overwritten due to asynchronous callback [duplicate]由于异步回调,变量被覆盖[重复]
【发布时间】:2016-04-25 19:04:26
【问题描述】:

我正在尝试使用 node.js 从文件系统访问多个文件。由于我正在尝试处理大量数据并且处理它们的顺序无关紧要,因此我想使用回调以异步方式执行此操作。我写了以下代码;

var fs = require('fs');

var basic_path="E:\\alphaDownload\\2016\\03";
var D1 = ['\\01','\\02','\\03','\\04'];
var D2 = ['\\00','\\01','\\02','\\03','\\04','\\05','\\06','\\07','\\08','\\09','\\10','\\11','\\12','\\13','\\14','\\15','\\16','\\17','\\18','\\19','\\20','\\21','\\22','\\23'];

var path=new Array(4);
for (var i=0;i<path.length;i++){
    path[i]=new Array(24);
}

for (var j1=0; j1<D1.length; j1++){
    for (var j2=0; j2<D2.length; j2++){
            path[j1][j2]=basic_path+D1[j1]+D2[j2];

            fs.readdir(path[j1][j2], function(err,items) {
                console.log("=============="+path[j1][j2]+"================");  
                console.log(items);
                if(err){throw err;}
                else{for (var i=0; i<items.length; i++) {
                    fs.readFile(path[j1][j2]+'\\'+items[i],'utf8',function read(error, data){
                        if (error) {
                            console.log("-------**"+error);
                        }
                        else {
                            console.log(data);}
                    });

                }}
            });

    }
}

但由于 readdirreadfile 函数的异步特性,索引变量 [j1] 和 [j2] 的值发生了变化,并且在 readfile 函数中传递了单个路径 [3][23]。

谁能想出一个出路。

【问题讨论】:

    标签: javascript node.js asynchronous concurrency


    【解决方案1】:

    使用async 库。 async.each() 允许异步调用集合的callbeack,当所有异步函数完成时,将调用主calbcak

    更新

    async.map 在你的情况下会更好

    【讨论】:

    • 谢谢大家。解决了
    【解决方案2】:

    由于索引变量在每个循环中都会被覆盖,因此您必须确定变量的范围。

    这是你的情况

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

    这里有两种方法

    for(var i = 0; i < 3; i++) {
      setTimeout(function(n){
        console.log(n);
      }.bind(this, i), 100);
    }
    
    for(var i = 0; i < 3; i++) {
      setTimeout((function(n){
        return console.log(n);
      })(i), 100);
    }
    

    也许这个例子可以帮助你理解这个想法

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 2016-10-23
      • 2016-04-18
      相关资源
      最近更新 更多