簡體   English   中英

Node.js:什么時候知道異步任務的集合何時完成?

[英]Node.js: When do you know when a collection of asynchronous tasks is done?

我想下降一個目錄,並針對正則表達式檢查在此看到的每個文件的名稱。 基本上,是通用unix find命令的一個版本,僅用Node.js編寫。 我不在乎文件的順序,但是我想確保我能全部得到文件。

我有以下代碼,(我認為)與我想要的代碼很接近。 它需要一個startdir,一個regexp和一個回調。 對於每個文件,它都會對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);
}

一些想法...

我從未使用過它,但是最簡單的方法可能是使用async.js walkfiles函數。 此處查看測試示例

否則,我將考慮構建一個函數調用數組,並從遞歸目錄遍歷函數返回該數組(而不是使用哨兵等)。 換句話說,check_directory返回與您要查找的文件匹配的函數調用數組。 如果沒有文件,則數組為空。

最后,在遞歸頂部合並數組,並使用async庫(與async.js不同)使用並行函數一次執行所有函數數組( 請參見此線程以獲取使用“ series”的示例 ) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM