【问题标题】:Nodejs asynchronus callbacks and recursionNodejs 异步回调和递归
【发布时间】: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

            })
        })
    }
}

所有的地狱都在节点的堆栈中松动,因为事情不会像在同步方法中那样以逻辑顺序发生。

【问题讨论】:

    标签: node.js recursion path directory fs


    【解决方案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的信息

    【讨论】:

      猜你喜欢
      • 2015-10-30
      • 2013-07-11
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      相关资源
      最近更新 更多