如何获取嵌套在两个赋值函数和一个 forEach 循环中的值

How do I get a value nested inside two assign functions and a forEach loop?

本文关键字:一个 forEach 循环 函数 两个 获取 何获取 嵌套 赋值      更新时间:2023-09-26

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

这是我现在的过程:

  1. 使用 dropboxClient.readdir(( 获取主目录中的文件夹列表
  2. 遍历文件夹并获取名称子文件夹(再次使用 dropboxClient.readdir(((
  3. 循环访问这些子文件夹并获取文件的名称。
  4. 如果文件是降价文件,请将名称添加到列表中
  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 上运行良好,所以生成器是一种选择,但这对我来说是一个新概念,我似乎找不到与我的匹配的示例。

利用异步包。具体来说,循环的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错误处理。如果在循环过程中遇到错误,它将在没有它的情况下继续循环。其中,#取决于文件,可能需要一段时间。