文件循环function

我在node.js中创build了一个循环遍历目录文件的函数。 它应该将文件名添加到returnDatavariables,然后返回returnData。 但是,它一直没有返回。 我已经在函数中放了几个console.log语句来帮助我debugging,但我无法弄清楚为什么它不起作用。

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语句能够打印这些文件,但是在返回之前的那一行只是打印一个新行。

你可以让函数返回一个承诺:

 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) => ...); 

fs.readdir是asynchronous的,这意味着当你调用它时不会返回结果。 而是将结果提供给callback,该命令在命令完成处理时调用。 它“callback”到你提供的function完成(因此名称)。

如果您想同步执行此操作,则可以执行以下操作:

 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; } 

这将返回一串混杂在一起的文件path,就像你的问题一样。

但是,阻塞通常不是一个好主意,您应该使用asynchronous版本。 我喜欢在这些情况下返回一个承诺 。 这是一个返回一个用string填充的承诺的例子。 这在技术上是没有必要的,因为可以使用callback…但只是假装。

 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)); 

这种asynchronous特性使得有点难以遵循,因为事情并不是按顺序发生的,但是当使用Promise时, then()用于处理稍后完成时发生在成功(或失败)上的事情。

最后,如果您使用ES2017 +(最新版本的Node),则可以使用async/await模式。 请记住我的承诺上面的例子:

 async function loopMusicAsync(directory) { try{ return await loopMusic(directory); //promise returned } catch(error) { console.log(error); //promise rejected return null; } }