2016-07-11 8 views
2

のfs.readFileのコールバックに追加パラメータを渡す追加のパラメータをfs.readFileのコールバック関数に渡すことは可能ですか?私は、ディレクトリを読み込んですべてのXML文書を解析するコードを持っています。追加の処理のためにファイル名をコールバックチェーンに渡す必要があります。今のところ私のコードはここノードjs

var fs = require('fs'); 
var path = require('path'); 

module.exports.extractXMLBody = function (dirPath, ext) { 
    fs.stat(dirPath, function (err, stats) { 
     if (stats.isDirectory()) { 
      fetchFiles(dirPath, ext, function (listOfFiles) { 
       _.each(listOfFiles, function (val, key) { 
        var completePath = dirPath + '/' + val; 
        var fileName = path.basename(val, path.extname(val)) 
        // TODO : Figure out to pass additional parameters 
        fs.readFile(fullPath, parseXML); 
       }); 
      }); 
     } 
    }); 
} 

parseXMLである私は、コールバック関数parseXMLに変数newFileNameを渡したい別の関数&として定義したコールバックです。

注:コールバックを匿名関数として記述すると、変数へのアクセスを渡すことができますが、コールバックのネストを避けるようにしています。

答えて

2

いいえ、fs.readFile()でサポートされていないため、コールバック関数に追加の値を渡すことはできません。コールバック関数には常に2つの値しか渡されません。 error-first callback構造体に従うので、最初のパラメータはErrorになります。存在しない場合はnull、次の引数にはファイルのデータが含まれている場合はnullを意味します。

fs.readFile()のコールバック内のfileName変数にアクセスする場合は、fs.readFile()と同じスコープ内で定義する必要があります。これは多かれ少なかれ無名の関数を使う必要があります。しかし、より良いError StackTracesのために名前をつけるべきです。

_.each(listOfFiles, function (val, key) { 
    var completePath = dirPath + '/' + val; 
    var fileName = path.basename(val, path.extname(val)); 

    fs.readFile(fullPath, function parseXML(err, data) { 
    if(err) { 
     console.log(err); 
    } 
    else { 
     // parseXML and still have access to fileName 
    } 
    }); 
}); 
+0

私にとっては悪いニュースです。匿名の機能で行くことを私に任せます。 –