2016-07-11 18 views
2

Ist es möglich, zusätzliche Parameter an die Callback-Funktion eines fs.readFile zu übergeben. Ich habe meinen Code, um ein Verzeichnis zu lesen und alle XML-Dokumente zu analysieren. Ich muss den Dateinamen in der Callback-Kette für die weitere Verarbeitung übergeben. Ab sofort ist mein CodeÜbergeben zusätzlicher Parameter an den Rückruf von fs.readFile im Knoten 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); 
       }); 
      }); 
     } 
    }); 
} 

Hier parseXML ist der Rückruf i als separate Funktion definiert haben & ich die Variable newFileName an die Callback-Funktion parseXML übergeben möchten.

Hinweis: Wenn ich den Callback als anonyme Funktion schreibe, kann ich den Zugriff auf die Variable übergeben, aber ich versuche, die weitere Verschachtelung von Callbacks zu vermeiden.

Antwort

2

Nein, Sie können keine zusätzlichen Werte an die Callback-Funktion übergeben, da dies von nicht unterstützt wird. Es gibt immer nur 2 Werte an die Callback-Funktion zurück. Es folgt eine error-first callback Struktur, das heißt, der erste Parameter ist ein Error oder Null, wenn einer nicht vorkommt, und das nächste Argument wird die Daten der Datei enthalten, falls es welche gibt.

Wenn Sie die fileName Variable in Ihrem Rückruf für fs.readFile() zugreifen wollen, dann müssen Sie es im gleichen Umfang zu definieren, wo fs.readFile() genannt wird. Dies würde mehr oder weniger erfordern, dass Sie mit einer anonymen Funktion gehen. Allerdings sollten Sie es immer noch für bessere Error StackTraces nennen.

_.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

das sind schlechte Nachrichten für mich. Mir bleibt keine andere Wahl, als mit anonymer Funktion zu gehen. –