2014-04-09 61 views
0

我願做這樣的事情的NodeJS asynchronus回調和遞歸

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 

      }) 
     }) 
    } 
} 

地獄破散在節點的堆棧,因爲他們在同步方法做事情不要在邏輯連續發生。

回答

0

你可以嘗試異步模塊,並使用這樣的:

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