2016-04-25 8 views
1

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

       }} 
      }); 

    } 
} 

が、割出変数によるreaddirの非同期性およびreadfile関数値[J1]及び[J2]変化と単一パス[3] [23]は、readfile関数に渡されます。

誰もが道案内を工夫できますか?

答えて

0

asyncライブラリを使用してください。 async.each()非同期収集のためcallbeackを呼び出すことができますし、すべての非同期機能が終了したら、メインcalbcakは

UPDATE

async.mapがいるので、あなたの場合

+0

みんなありがとうを取得するのに役立ちます。それを解決した –

0

に良くなると呼ばれますインデックスのvarが各ループでオーバーライドされると、varsをスコープする必要があります。

これはあなたのケース

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

はたぶん、この例では、あなたのアイデアに

関連する問題