【问题标题】:Node.js: When do you know when a collection of asynchronous tasks is done?Node.js:你什么时候知道异步任务集合何时完成?
【发布时间】:2011-08-02 05:10:28
【问题描述】:

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

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

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

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);
}

【问题讨论】:

    标签: asynchronous node.js


    【解决方案1】:

    一些想法......

    我从未使用过它,但最简单的方法可能是使用 async.js walkfiles 函数。请参阅tests for an example here。

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

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

    【讨论】:

    • 我要检查一下。我想避免使用任何异步库,并弄清楚如何为自己做这件事,所以我了解异步编组是如何工作的,但我想这是解释学的一个案例......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多