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 异步回调和递归的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅的处理Nodejs中的异步回调

nodejs异步回调函数中this问题,求助

Nodejs的事件驱动异步回调

详解回调函数——以JS为例解读异步回调和EventLoop

Nodejs 异步编程 - 为啥需要“异步”模块?啥是“回调地狱”/“末日金字塔”?

NodeJS 异步回调未完成和渲染把手模板