如何获取嵌套在两个赋值函数和一个 forEach 循环中的值
How do I get a value nested inside two assign functions and a forEach loop?
我正在编写一个NodeJS模块,该模块从Dropbox复制一堆文件夹,并根据文件夹结构创建一个目录。让我头疼的部分是我需要获取主目录中所有文件夹的名称,然后获取文件夹中所有文件的名称,然后再转到下一个函数。
这是我现在的过程:
- 使用 dropboxClient.readdir(( 获取主目录中的文件夹列表
- 遍历文件夹并获取名称子文件夹(再次使用 dropboxClient.readdir(((
- 循环访问这些子文件夹并获取文件的名称。
- 如果文件是降价文件,请将名称添加到列表中
- 返回子目录中所有 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 上运行良好,所以生成器是一种选择,但这对我来说是一个新概念,我似乎找不到与我的匹配的示例。
利用异步包。具体来说,循环的each
、eachSeries
或eachLimit
,以及控制流的waterfall
和series
。
我建议阅读...每。。。的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
错误处理。如果在循环过程中遇到错误,它将在没有它的情况下继续循环。其中,#取决于文件,可能需要一段时间。
相关文章:
- 为什么我们在ES2015中需要一个新的for循环结构,而我们已经有了for、forEach
- Foreach循环只返回最后一个值
- promise.all在一个forEach循环中——所有东西都同时启动
- Angularjs foreach 只返回一个对象
- forEach 仅执行数组的最后一个元素
- MongoDB map/reduce,forEach不是一个函数
- 淘汰赛-给一个<李>foreach中的元素<ul>其中<李>元素
- 我如何做一个纯Javascript foreach循环并打印出结果firebase
- Angular.forEach 只返回一个结果
- (jQuery)foreach-loop 内的选项卡 ->一个页面上多个选项卡的问题
- 匿名回调函数抛出错误,使一个像forEach一样遍历数组
- foreach 只产生一个结果
- PHP foreach 循环和每个循环的一个 AJAX 调用
- 如何获取嵌套在两个赋值函数和一个 forEach 循环中的值
- Javascript 在 foreach 循环中添加事件侦听器,只有最后一个条目有效
- Angular Selected - a.forEach 不是一个函数
- javascript数组弹出,没有另一个foreach循环
- Dojo -如何在另一个forEach中的选定节点上使用forEach
- Coffeescription:跳出一个forEach循环
- Node.js的一个forEach循环中的Async承诺在另一个then语句中