Node.js 如何知道nodejs中的非阻塞递归作业已完成
我已经编写了这个非阻塞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)
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调用。