Node.js:你什么时候知道asynchronous任务的集合是什么时候完成的?

我想下载一个目录,并检查我看到的每个文件的名称与正则expression式。 基本上,一个常见的unix find命令的版本,只能写在Node.js中。 我不在乎这些文件的顺序,但是我确实要确保所有的文件都可以得到。

我有以下的代码,这是接近(我认为)我想要的。 它需要一个startdir,一个正则expression式和一个callback; 对于它分析的每个文件,它将sentinel的值递增1,当分析完成时,递减哨兵。 我担心的是,如果只有一个文件和一个深度嵌套的目录集合,它将分析该文件并在find第二个文件之前很长时间触发callback,并且可能会调用两次callback。

显然,我可以通过让一个firedvariables来限制它的第二次触发来阻止这个callback被两次调用。 但是,这仍然会给我错误的数据。 我在这里做错了什么,是否有一个更适合节点的方式来做到这一点?

 fs = require('fs') path = require('path') function get_all_files(startdir, regexp, callback) { var sentinel = 0; var results = []; function check_sentinel() { sentinel--; if (sentinel === 0) { callback(results); } } function check_file(dir, filename) { var fname; sentinel++; if (regexp.test(filename)) { results.push(path.join(dir, filename)); } check_sentinel(); } function check_directory(dir) { fs.readdir(path.join(this.rootpath, dirpath), function(err, files) { var fname, i, len, npath; if (err) { throw err } for (i = 0, len = files.length; i < len; i++) { fname = files[i]; npath = path.join(dir, fname); fs.stat(npath, function(err, stats) { if (stats.isFile()) { check_file(dir, fname); } else { if (stats.isDirectory()) { check_directory(npath); } } }); } }); } check_directory(startdir); } 

几个想法…

我从来没有使用它,但最简单的方法来做你所要求的可能是使用async.js walkfiles函数。 在这里看一个例子的testing 。

否则,我会考虑构build一个函数调用数组,并从recursion目录散步函数(而不是使用标记等)返回数组。 换句话说,check_directory返回与您正在查找的文件相匹配的函数调用数组。 如果没有文件,数组是空的。

最后,结合recursion顶部的数组,并使用asynchronous库(与async.js不一样),使用并行函数一次执行所有函数数组( 请参阅本主题中使用“系列”的示例 ) 。