2016-06-21 6 views
0

Ich habe einen Ordner von JSON-Dateien auf dem Dateisystem. Jetzt versuche ich, jede JSON-Datei in ein Objekt zu laden, das gut funktioniert. Problem beginnt, wenn ich versuche, jedes Objekt in ein Array zu schieben. Meine loadJSONFolderFiles() gibt nur ein Array von Versprechen zurück.Laden jeder Datei eines Ordners als JSON-Array

function loadJSONFolderFiles(p_path) { 
    var deferred = Q.defer(); 
    var subfiles = []; 
    fs.readdir(p_path, function (err, files) { 
     if (err) { 
      return rxError("internal", 2002, "could not read folder"); 
     } 
     files.forEach(function (subfile) { 
      var deferredLink = Q.defer(); 
      var folderFilePath = p_path + "/" + subfile; 
      console.log("accessing " + folderFilePath);     

      // loadJSONFile() tested and works fine 
      loadJSONFile(folderFilePath).then(function (p_file) { 
       console.log("adding file " + folderFilePath); 
       deferredLink.resolve(p_file); 
      }); 
      subfiles.push(deferredLink.promise); 
     }); 
     deferred.resolve(subfiles); 
    }); 
    return deferred.promise; 
} 
+1

Mögliche Duplikat [Promises mit fs und drossel] (http: // stackoverflow.com/questions/19429193/promises-with-fs-and-bluebird) –

Antwort

1

Weil Sie sind drängen Versprechen in die subfiles Array.

Hier ist eine einfache Lösung. Es können Fehler haben, wenn Sie es ausführen, aber Sie sollten in einer einfacheren Position zumindest sein, sie im Falle zu beheben Sie Probleme:

function loadJSONFolderFiles(p_path) { 
    var deferred = Q.defer(); 
    var subfiles = []; 
    fs.readdir(p_path, function (err, files) { 
     if (err) { 
      return rxError("internal", 2002, "could not read folder"); 
     } 
     var total = files.length; 
     files.forEach(function (subfile) { 
      //var deferredLink = Q.defer(); 
      var folderFilePath = p_path + "/" + subfile; 
      console.log("accessing " + folderFilePath);     

      // loadJSONFile() tested and works fine 
      loadJSONFile(folderFilePath).then(function (p_file) { 
       console.log("adding file " + folderFilePath); 
       //deferredLink.resolve(p_file); 
       subfiles.push(p_file); 
       if(subfiles.length === total) { 
        deferred.resolve(subfiles); 
       } 
      }); 

     }); 
     //deferred.resolve(subfiles); 
    }); 
    return deferred.promise; 
} 
+0

Danke, funktioniert gut. – user3601578