由于异步回调,变量被覆盖

variables are overwritten due to asynchronous callback

本文关键字:变量 覆盖 回调 于异步 异步      更新时间:2023-09-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]。

谁能想出出一条出路。

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

更新

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

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

这是你的情况

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);
}

也许这个例子可以帮助你得到这个想法