首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件循环函数

文件循环函数
EN

Stack Overflow用户
提问于 2017-06-28 00:45:40
回答 2查看 48关注 0票数 1

我在node.js中创建了一个遍历目录文件的函数。它应该将文件名添加到returnData变量中,然后返回returnData。但是,它一直不返回任何内容。我已经在函数中添加了一些console.log语句来帮助我进行调试,但是我不明白为什么它不能工作。

代码语言:javascript
复制
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语句可以打印文件,但是在返回之前的语句只能打印一个新行。

EN

回答 2

Stack Overflow用户

发布于 2017-06-28 01:14:10

您可以让函数返回一个promise:

代码语言:javascript
复制
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);
    });
}

您将以这种方式使用:

代码语言:javascript
复制
loopMusic('...')
   .then((data) => console.log(data))
   .catch((err) => ...);
票数 2
EN

Stack Overflow用户

发布于 2017-06-28 01:17:44

fs.readdir是异步的,这意味着当您调用它时,它不会返回结果。而是将结果提供给回调,该回调在命令完成处理时调用。当它完成时,它会“回调”你所提供的函数(由此得名)。

如果您希望同步执行此操作,可以执行以下操作:

代码语言:javascript
复制
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,让我们假装一下。

代码语言:javascript
复制
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);        
        });
    });
}

用法:

代码语言:javascript
复制
var musicPromise = loopMusic(dir);
musicPromise.then((musicStr) => console.log(musicStr)), (err) => console.log(err));

这种情况的异步性质使得它有点难以遵循,因为事情没有按顺序发生,但是当使用Promise时,then()用于处理在成功(或失败)时发生的事情。

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

代码语言:javascript
复制
async function loopMusicAsync(directory) {
    try{
        return await loopMusic(directory); //promise returned
    }
    catch(error) {
        console.log(error); //promise rejected
        return null;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44785726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档