2016-05-06 14 views
-1

Also, ich bin durch die Node.js learnyounode Tutorial (das ist ziemlich lustig), aber ich bin kein Fremder zu Javascript. Eine der Anforderungen besteht darin, dass der Benutzer ein Programm schreibt, das ein Verzeichnis und eine Dateierweiterung als Argumente akzeptiert, und dann mit den Dateien fortfährt, die mit der angegebenen Erweiterung übereinstimmen.Wie übergeben Sie zusätzliche Argumente für die integrierte Node.js-Funktion?

Beim Überprüfen meiner Argumente an verschiedenen Stellen, an denen Daten durch Funktionen übergeben werden, kann ich Node.js nicht dazu bringen, dass ich zusätzliche Argumente an eine Callback-Funktion für eine eingebaute Funktion übergebe.

Zum Beispiel kann ich das folgende Snippet ausführen, einen Fehler, einen Pfad und eine Erweiterung übergeben und möchte alle übergebenen Argumente sehen, aber ich sehe nur Fehler und Daten im arguments-Objekt während der "ext" Variable wird ignoriert.

var fs = require("fs"), path = require("path") 
var dir = process.argv[2], ext = process.argv[3]; 

fs.readdir(dir, function (err, data, ext) { 
    console.log(arguments); 
    }); 

Der Grund für diese Funktionalität besteht darin, zu vermeiden, den Funktionsumfang zu brechen, um den Wert von ext.

Ich kann diese Art von Sache mit benutzerdefinierten Funktionen den ganzen Tag, aber die eingebauten Funktionen sind ein bisschen weniger nachsichtig.

Danke, Bob

+0

es für Sie Sinn macht, dass „wollen "Eine Funktion/Funktionalität stellt es zur Verfügung? Sie * wissen * das ist nicht die API, warum versuchen Sie das zu tun? – Amit

+0

Ich wünsche mir nichts, ich frage mich nur, ob es einen Weg gibt. Ich habe klar gesagt, warum ich diese Funktionalität wollte, also werde ich es noch einmal sagen. "Der Grund für diese Funktionalität ist, den Funktionsumfang nicht zu zerstören" –

+0

Und ich wiederhole auch, "Sie wissen, dass das nicht die API ist". – Amit

Antwort

0

Der einfachste Weg ist es, nur die auf jedem Eintrag Name path.extname() Funktion Built-in verwenden:

fs.readdir(dir, function(err, entries) { 
    if (err) throw err; 
    for (var i = 0; i < entries.length; ++i) { 
    if (path.extname(entries[i]) === ext) 
     console.log(entries[i]); 
    } 
}); 
den node.js Menschen in irc Talked
+0

Danke für die Lösung, aber das ist nicht ganz das, was ich gefragt habe. –

+0

Dies ist wirklich die einzige Möglichkeit, es zu tun. Wie in den Kommentaren zu Ihrer Frage erwähnt, gibt es keine Möglichkeit, zusätzliche Funktionsparameter bereitzustellen, wie Sie es vorgeschlagen haben und Knoten magisch gehorchen und Werte für diese zusätzlichen Parameter bereitstellen. Knoten analysiert keine Callback-Parameternamen oder Anzahl Callback-Parameter. – mscdex

+0

Ja, zusätzliche Parameter kommen nicht in Frage. Es sieht so aus, als ob die einzige Möglichkeit darin besteht, benutzerdefinierte Closures zu erstellen, eine Klasse zu erstellen, in die der Code eingefügt werden kann, oder das Modul in eine eigene Closure umzubrechen (Standardverhalten). –

0

, stellt sich heraus, die JavaScript funktioniert so eine Methode, um Umfang in Grenzen zu halten ist nicht notwendig. Node.js versetzt Module standardmäßig in ihre eigenen Schließungen, sodass auf die Variablen außerhalb der Funktion zugegriffen werden kann und der globale Namespace nicht beeinträchtigt wird.

Diese Antwort auf node js and variable scope gefunden, die wahrscheinlich am besten zu meiner Situation passt, aber ich wusste nicht, dass es das ist, was ich brauchte, als ich meine Frage posten musste.

Auch einige nette closure examples auf Mozilla gefunden.

Auf eine persönliche Note Ich dachte, ich Javascript wusste ein wenig besser als das, und ich hoffe, dass diese Antwort hilft den Menschen, die von C/PHP Hintergründe in node.js kommen