gpt4 book ai didi

asynchronous - Node.js:您什么时候知道异步任务集合何时完成?

转载 作者:太空宇宙 更新时间:2023-11-03 22:19:14 24 4
gpt4 key购买 nike

我想深入一个目录,并根据正则表达式检查我在其中看到的每个文件的名称。基本上,是常见的 unix find 命令的一个版本,仅用 Node.js 编写。我不关心文件的顺序,但我确实想确保获得所有文件。

我有以下代码,(我认为)它接近我想要的。它需要一个 startdir、一个正则表达式和一个回调;对于它分析的每个文件,它会将哨兵的值增加 1,并且当分析完成时,它会减少哨兵。我担心的是,如果有一个文件和一组深度嵌套的目录,它会在找到第二个文件之前分析该文件并触发回调,并且回调可能会被调用两次。

显然,我可以通过使用 fired 变量来限制回调再次触发,从而防止回调被调用两次。但这仍然会给我错误的数据。我在这里做错了什么,有没有更适合 Node 的方法来做到这一点?

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步行文件功能。请参阅tests for an example here .

否则,我会考虑构建一个函数调用数组并从递归目录遍历函数返回该数组(而不是使用哨兵等)。换句话说,check_directory 返回与您要查找的文件匹配的函数调用数组。如果没有文件,则数组为空。

最后,合并递归顶部的数组并使用 async库(与 async.js 不同)使用 parallel 一次性执行函数数组函数(see this thread for an example using "series")。

关于asynchronous - Node.js:您什么时候知道异步任务集合何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6907517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com