我在node.js中创建了一个遍历目录文件的函数。它应该将文件名添加到returnData变量中,然后返回returnData。但是,它一直不返回任何内容。我已经在函数中添加了一些console.log语句来帮助我进行调试,但是我不明白为什么它不能工作。
function loopMusic (directory) {
var returnData = "";
fs.readdir (directory, function (err, files) {
if (err) {
console.log (err);
}
files.forEach (function (file, index) {
returnData += file;
console.log (returnData);
});
});
console.log (returnData);
return returnData;
}第一个console.log语句可以打印文件,但是在返回之前的语句只能打印一个新行。
发布于 2017-06-28 01:14:10
您可以让函数返回一个promise:
function loopMusic (directory) {
return new Promise((resolve, reject) => {
fs.readdir (directory, function (err, files) {
if (err) {
reject(err);
return;
}
files.forEach (function (file, index) {
returnData += file;
console.log (returnData);
});
resolve(returnData);
});
}您将以这种方式使用:
loopMusic('...')
.then((data) => console.log(data))
.catch((err) => ...);发布于 2017-06-28 01:17:44
fs.readdir是异步的,这意味着当您调用它时,它不会返回结果。而是将结果提供给回调,该回调在命令完成处理时调用。当它完成时,它会“回调”你所提供的函数(由此得名)。
如果您希望同步执行此操作,可以执行以下操作:
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;
}这将返回一个混在一起的文件路径字符串,如您的问题所示。
但是,阻塞通常不是一个好主意,您应该使用异步版本。在这些情况下,我喜欢返回Promise。下面是一个返回包含该字符串的promise的示例。这在技术上是不必要的,因为回调可以是used...but,让我们假装一下。
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);
});
});
}用法:
var musicPromise = loopMusic(dir);
musicPromise.then((musicStr) => console.log(musicStr)), (err) => console.log(err));这种情况的异步性质使得它有点难以遵循,因为事情没有按顺序发生,但是当使用Promise时,then()用于处理在成功(或失败)时发生的事情。
最后,如果您使用的是ES2017+ (Node的最新版本),则可以使用async/await模式。记住我上面的promise示例:
async function loopMusicAsync(directory) {
try{
return await loopMusic(directory); //promise returned
}
catch(error) {
console.log(error); //promise rejected
return null;
}
}https://stackoverflow.com/questions/44785726
复制相似问题