fs.readdir
ist asynchron, es bedeutet nicht zurück mit dem Ergebnis, wenn man es so nennen . Stattdessen wird das Ergebnis dem Rückruf bereitgestellt, der aufgerufen wird, wenn der Befehl die Verarbeitung beendet. Es ruft die Funktion zurück, die Sie angegeben haben (daher der Name).
Wenn Sie dies synchron tun wollten können Sie folgendes tun:
function loopMusic (directory) {
var returnData = "";
var files = fs.readdirSync(directory);
files.forEach (function (file, index) {
returnData += file;
console.log (returnData);
});
console.log(files);
return returnData;
}
, dass eine Reihe von mushed zusammen Pfaden Datei, wie in Ihrer Frage zurückkommen würde.
Blockieren ist jedoch normalerweise keine gute Idee und Sie sollten die asynchrone Version verwenden. Ich möchte in diesen Situationen eine Promise zurückgeben. Hier ist ein Beispiel, das ein Versprechen mit dieser Zeichenfolge zurückgibt. Dies ist technisch nicht notwendig, da der Callback einfach verwendet werden könnte ... aber lassen Sie uns einfach so tun.
function loopMusic (directory) {
return new Promise(function(resolve, reject) {
fs.readdir (directory, function (err, files) {
if (err) {
return reject(err);
}
let returnData = "";
files.forEach (function (file, index) {
returnData += file;
});
resolve(returnData);
});
});
}
Verbrauch:
var musicPromise = loopMusic(dir);
musicPromise.then((musicStr) => console.log(musicStr)), (err) => console.log(err));
Die asynchrone Natur dieser es ein bisschen schwer zu folgen, macht da Dinge, um nicht passieren, aber wenn Promises mit der then()
verwendet wird, zu handhaben, was passiert, Erfolg (oder Misserfolg), wenn es später vervollständigt wird. Wenn Sie ES2017 + (die neueste Version von Node) verwenden, können Sie das Muster async/await
verwenden. Denken Sie daran, mein Versprechen Beispiel oben:
async function loopMusicAsync(directory) {
try{
return await loopMusic(directory); //promise returned
}
catch(error) {
console.log(error); //promise rejected
return null;
}
}
Sie müssen etwas über asynchronen Code und wie Callbacks arbeiten. – gforce301
'fs.readdir' ist asynchron, daher wird es später aufgerufen, dann wird die Methode zurückgegeben. Die Dateisystembibliothek in nodejs erlaubt synchrone Aufrufe, die als "readdirSync" bezeichnet werden und ein Array von Strings zurückgibt. –
Mögliches Duplikat von [Wie gebe ich die Antwort von einem asynchronen Anruf zurück?] (Https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-a-asynchronous-call) – gforce301