2016-04-04 10 views
1

Ich versuche, einige Dateien von dir mit async.waterfall zu lesen, scheint es mir, dass ich Sachen richtig mache, aber ich bekomme den angegebenen Fehler und die readData-Funktion wird nie aufgerufen . Was ist los mit dir?Knoten async Wasserfall Rückruf wurde bereits

var fs = require("fs"); 
var async = require("async"); 

var folder = "./files/"; 

try { 
    async.waterfall([ 
     function readDir(cb) { 
      fs.readdir(folder, function(err, files) { 
       cb(err, files); 
      }); 
     }, 
     function loopFiles(files, cb) { 
      files.forEach(function(fn) { 
       console.log("loop " + fn); 
       cb(null, fn); 
      }); 
     }, 
     function check(fn, cb) { 
      console.log("check "+fn); 
      fs.stat(folder + fn, function(err, stats) { 
       console.log(stats.isFile()); 
       cb(err, stats, fn); 
      }); 
     }, 
     function readData(stats, fn, cb) { 
      console.log("read "+fn); 
      if (stats.isFile()) { 
       fs.readFile(folder + fn, "utf-8", function(err, data) { 
        cb(err, data); 
       }); 
      } 
     } 
    ], function(err, result) { 
     if (err) { 
      throw err; 
     } 
     console.log(result); 
    }); 
} catch (err) { 
console.log(err); 
} 

Antwort

3

Das Problem ist, dass Sie cb(null, fn) in loopFiles() mehrmals, wenn files.length > 1 sind aufgerufen wird. Sie müssen wahrscheinlich eine separate async.waterfall() oder verwenden Sie eine andere async.* Methode für jede Datei.

Ein weiteres Problem ist, in readData(), wo Sie sind nicht cb() im Fall aufrufen, die stats.isFile() zu false auswertet.

Verwandte Themen