Nodejs 异步回调和递归
Posted
技术标签:
【中文标题】Nodejs 异步回调和递归【英文标题】:Nodejs asynchronus callbacks and recursion 【发布时间】:2014-05-21 23:08:42 【问题描述】:我想做这样的事情
function scan(apath)
var files = fs.readdirSync(apath);
for(var i=0; i<files.length;i++)
var stats = fs.statSync(path.join(apath,files[i]))
if(stats.isDirectory())
results.push(path.join(apath, files[i]))
scan(path.join(apath,files[i]))
if(stats.isFile())
results.push(path.join(apath,files[i]))
但异步。
尝试使用异步函数让我陷入了这样的噩梦。
function scan(apath)
fs.readdir(apath, function(err, files))
var counter = files.length;
files.forEach(function(file)
var newpath = path.join(apath, file)
fs.stat(newpath, function(err, stat)
if(err) return callback(err)
if(stat.isFile())
results.push(newpath)
if(stat.isDirectory())
results.push(newpath)
scan(newpath)
if(--counter <=0) return
)
)
所有的地狱都在节点的堆栈中松动,因为事情不会像在同步方法中那样以逻辑顺序发生。
【问题讨论】:
【参考方案1】:你可以试试异步模块,像这样使用:
function scan(apath, callback)
fs.readdir(apath, function(err, files)
var counter = 0;
async.whilst(
function()
return counter < files.length;
,
function(cb)
var file = files[counter++];
var newpath = path.join(apath, file);
fs.stat(newpath, function(err, stat)
if (err) return cb(err);
if (stat.isFile())
results.push(newpath);
cb(); // asynchronously call the loop
if (stat.isDirectory())
results.push(newpath);
scan(newpath, cb); // recursion loop
);
,
function(err)
callback(err); // loop over, come out
);
);
寻找更多关于async.whilst的信息
【讨论】:
以上是关于Nodejs 异步回调和递归的主要内容,如果未能解决你的问题,请参考以下文章