Node.js 如何知道nodejs中的非阻塞递归作业已完成

Node.js 如何知道nodejs中的非阻塞递归作业已完成,node.js,recursion,nonblocking,Node.js,Recursion,Nonblocking,我已经编写了这个非阻塞nodejs示例递归文件搜索代码,问题是我无法确定任务何时完成。我想计算一下这项任务所花费的时间 fs = require('fs'); searchApp = function() { var dirToScan = 'D:/'; var stringToSearch = 'test'; var scan = function(dir, done) { fs.readdir(dir, function(err, files)

我已经编写了这个非阻塞nodejs示例递归文件搜索代码,问题是我无法确定任务何时完成。我想计算一下这项任务所花费的时间

fs = require('fs');

searchApp = function() {

    var dirToScan = 'D:/';

    var stringToSearch = 'test';

    var scan = function(dir, done) {
        fs.readdir(dir, function(err, files) {
            files.forEach(function (file) {
                var abPath = dir + '/' + file;
                try {
                    fs.lstat(abPath, function(err, stat) {
                        if(!err && stat.isDirectory()) {
                            scan(abPath, done);;
                        }
                    });
                }
                catch (e) {
                    console.log(abPath);
                    console.log(e);
                }

                matchString(file,abPath);
            });
        });
    }

    var matchString = function (fileName, fullPath) {
        if(fileName.indexOf(stringToSearch) != -1) {
            console.log(fullPath);
        }
    }

    var onComplte = function () {
        console.log('Task is completed');
    }

    scan(dirToScan,onComplte);
}


searchApp();

上面的代码完美地完成了搜索,但我无法确定递归何时结束

这并不是那么直截了当,我想你必须依靠计时器和承诺

fs = require('fs');
var Q = require('q');
searchApp = function() {

    var dirToScan = 'D:/';    
    var stringToSearch = 'test';
    var promises = [ ];
    var traverseWait = 0;

    var onTraverseComplete = function() {
      Q.allSettled(promises).then(function(){
       console.log('Task is completed');
      });
    }

    var waitForTraverse = function(){
      if(traverseWait){
        clearTimeout(traverseWait);
      } 
      traverseWait = setTimeout(onTraverseComplete, 5000);  
    }

    var scan = function(dir) {
        fs.readdir(dir, function(err, files) {
            files.forEach(function (file) {
                var abPath = dir + '/' + file;
                var future = Q.defer();
                try {
                    fs.lstat(abPath, function(err, stat) {
                        if(!err && stat.isDirectory()) {
                            scan(abPath);                                
                        }
                    });
                }
                catch (e) {
                    console.log(abPath);
                    console.log(e);
                }

                matchString(file,abPath);
                future.resolve(abPath);
                promises.push(future);
                waitForTraverse();
            });
        });
    }

    var matchString = function (fileName, fullPath) {
        if(fileName.indexOf(stringToSearch) != -1) {
            console.log(fullPath);
        }
    }



    scan(dirToScan);
}



searchApp();

您需要一些基于承诺或基于回调的流控制库。对于后者,我建议使用异步。您可能希望它的并行函数执行所有这些asny fs.lstat调用。