2012-03-08 22 views
4

私はいくつかのファイルのURLを保持する配列を持っています。例:ノード内の複数のファイルを非同期に読み込みキャッシュする

var files = ['1.html', '2.html', '3.html']; 

これらを非同期で読み取り、cache(cache = {})という名前のオブジェクトに保存する必要があります。それはスコープです私はループの後、「readFileの」行為が終了したことを理解して

cache = { undefined : 'File 3 content' } 

、それは失った:私は結果を持って

for(var i = 0; i < files.length; i++){ 
    require('fs').readFile(files[i], 'utf8', function (error,data) { 
     cache[files[i]]=data; 
    }); 
} 

最後に: はこれを行うには、私は、コードを使用しました。この方法や別の方法でファイルを配列から読み込んでキャッシュする方法を修正する方法はありますか?

答えて

16

readFileへのコールバックを実行すると、forループは既に終了しています。したがって、ifiles.lengthになり、files[i]undefinedになります。これを軽減するには、変数をクロージャでラップする必要があります。これを実行する最も簡単な方法は、あなたのreadFile呼び出しを行う関数を作成し、ループ内でそれを呼び出すことです:より良い実行制御について

function read(file) { 
    require('fs').readFile(file, 'utf8', function (error,data) { 
     cache[file]=data; 
    }); 
} 

for(var i = 0; i < files.length; i++){ 
    read(files[i]); 
} 

、あなたはasyncに見たいと思うかもしれません:

function readAsync(file, callback) { 
    fs.readFile(file, 'utf8', callback); 
} 

async.map(files, readAsync, function(err, results) { 
    // results = ['file 1 content', 'file 2 content', ...] 
}); 

編集:非同期の例でヘルパー機能を使用しました。

+0

おかげで、それが動作) – micnic

+0

私は非同期を使用していますが、私はのReadFile関数の引数として「UTF8」を渡す必要があり、どのように私がすべきこれを行う? – jeroen

+1

@jeroen: 'utf8'を渡すヘルパー関数を作成する必要があります。 'function read(file、callback){fs.readFile(file、 'utf8'、callback)}'のようなものです。 *編集*:編集済みの記事を参照してください! –

0

既存の回答は私のためには機能しませんでした。私は仕事をしたNPMパッケージを見つけました:https://www.npmjs.com/package/read-multiple-files。コマンドラインでnpm install read-multiple-filesした後、ここで私が使用したコードは次のとおりです。

var files = ['1.html', '2.html', '3.html']; 

console.log("\n"); 

readMultipleFiles(files, 'utf8', function(err, inputFiles) { 
    if(err) { 
    console.log("Read Error: " + err); 
    } 

    fileOne = inputFiles[0]; 
    fileTwo = inputFiles[1]; 
    ... 

    console.log(fileOne); 
    console.log(fileTwo); 

});