【问题标题】:How do I get a value nested inside two assign functions and a forEach loop?如何获得嵌套在两个分配函数和一个 forEach 循环中的值?
【发布时间】:2014-12-03 20:52:59
【问题描述】:

我正在编写一个 NodeJS 模块,它从 Dropbox 复制一堆文件夹,并根据文件夹结构创建一个目录。让我头疼的部分是我需要获取主目录中所有文件夹的名称,然后是文件夹中所有文件的名称,然后再继续执行下一个功能。

这是我现在的流程:

  1. 使用 dropboxClient.readdir() 获取主目录中的文件夹列表
  2. 遍历文件夹并获取名称子文件夹(再次使用 dropboxClient.readdir())
  3. 遍历这些子文件夹并获取文件名。
  4. 如果文件是 Markdown 文件,请将名称添加到列表中
  5. 返回子目录下所有markdown文件的列表

还有一些伪代码:

function getListOfFiles() {

    var subfolders = [];
    var fileNames = [];

    dbClient.readdir('', function(error, folders) {

      folders.forEach(function(folder, index) {

        subfolders.push(folder);
        dbClient.readdir('/'+folder, function(error, subfolders) {

          subfolders.forEach(function(subfolder, index) {

            dbClient.readdir('/'+folder+'/'+subfolder, function(error, files) {

              files.forEach(function(file, index) {

                if (isMarkdownFile) {
                  fileNames.push(file)
                }

              });

            });
          });
        });
      }
    });

    return fileNames;

}

我研究了一些似乎应该解决这种情况的包以及 JS 生成器,但我不确定最简单的解决方案应该是什么。我的代码在 Node 0.11.3 上运行良好,因此生成器是一种选择,但这对我来说是一个新概念,我似乎找不到与我匹配的示例。

【问题讨论】:

    标签: javascript node.js asynchronous callback generator


    【解决方案1】:

    使用async package。具体来说,eacheachSerieseachLimit 用于循环,waterfallseries 用于控制流。

    我建议您阅读...每个...each 函数,以确定哪个对您的情况有效且一致/可靠。

    function getListOfFiles(callback) {
    
        async.waterfall([
    
            // get a list of the top level folders
            function (cb) {
    
                dbClient.readdir('', function (error, topLevelFolders) {
                    if (error) return cb(error);
    
                    cb(null, topLevelFolders);  // pass the folders to the next function (this is the "waterfall")
                });
    
            },
    
            // get an array of all topLevel/subFolders combos
            function (topLevelFolders, cb) {
    
                var everySubFolder = [];
    
                async.each(topLevelFolders, function (folder, subFolderCallback) {
    
                    dbClient.readdir(folder, function (error, subFolders) {
                        if (error) return subFolderCallback(error);
    
                        everySubFolder = everySubFolder.concat(subFolders);
                    });
    
                }, function (error) {
                    if (error) return cb(error);
    
                    cb(null, everySubFolder); // pass all the folder/subfolder combos to the next function
                });
            },
    
            // get an array of all the files in each folder/subfolder
            function (everySubfolder, cb) {
    
                var fileNames = [];
    
                async.each(everySubFolder, function (folder, fileNameCallback) {
    
                    dbClient.readdir(folder, function (error, files) {
                        if (error) return fileNameCallback(error);
    
                        fileNames = fileNames.concat(files);
                        fileNameCallback();
                    });
    
                }, function (error) {
                    if (error) return cb(error);
    
                    cb(null, fileNames); // pass every file combo to the waterfall callback function
                });
    
            }
    
        ], function (error, fileNames) {
            if (error) return callback(error);
    
            callback(null, fileNames); // all done! Every file combo goes the function's callback!
        });
    }
    

    当你使用它时,你会做:

    getListOfFiles(function (err, files) {
        // Voila! here are all your files
    });
    

    绝对添加.each 错误处理。如果它在循环期间遇到错误,它将在没有它的情况下继续循环。其中,依赖于 # 个文件,可能需要一段时间。

    【讨论】:

    • 谢谢!这正是我正在寻找的故障。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2021-03-18
    • 2017-11-18
    • 2017-12-25
    • 2015-05-29
    相关资源
    最近更新 更多