0

In einer Chrome-Erweiterung im HTML5 FileSytem API.HTML 5 FileSytem, ​​kombinieren FileEntry mit MetaData-Array von Rückruf

Im Abrufen einer Liste von Datensätzen in einem Ordner.

var entries = []; 
var metadata = []; 
listFiles(folder); 

function listFiles(fs) { 

    var dirReader = fs.createReader(); 
    entries = []; 

    // Call the reader.readEntries() until no more results are returned. 
    var readEntries = function() { 
     dirReader.readEntries(function (results) { 
      if (!results.length) { 
       addMeta(entries); 
      } else { 
       console.log(results); 
       entries = entries.concat(toArray(results)); 
       readEntries(); 
      } 
     }); 
    }; 

    readEntries(); // Start reading dirs. 

} 

Das FileEntry-Objekt enthält keine Metadaten, ich brauche das Datum der letzten Änderung. Ich bin in der Lage, ein Objekt der Metadaten

Problem ist, dass ich die Metadaten in einem Rückruf erhalten. Wie kann ich die beiden Objekte verbinden, um sicherzustellen, dass die richtige Übereinstimmung gefunden wird? Das vereinfachte Ergebnis im suchen ist:

[ 
["fileName1", "modifyDate1"], 
["fileName2", "modifyDate2"], 
] 

Antwort

2
  1. Um LastModifiedDate zu bekommen, müssen Sie nicht getMetadata verwenden müssen, gemäß der Beschreibung von this question, nur entry.file.lastModifiedDate verwenden, obwohl vielleicht file() einer anderen Rückruf ist.
  2. Um "die beiden Objekte zu verbinden, die sicherstellen, dass die richtige Übereinstimmung hergestellt wird", können Sie den folgenden Code verwenden, um die richtigen Ergebnisse zu erhalten: Closures. (Die Datenstruktur Unter der Annahme [[entry, metadata]] wie Sie bereits erwähnt)

    var ans = []; 
    function addMeta(entries) { 
        for (var i = 0; i < entries.length; i++) { 
         (function(entry) { 
          entry.getMetadata(function (metadata) { 
           ans.push([entry, metadata]); 
          }); 
         }(entries[i]); 
        } 
    } 
    
  3. Wenn das, was Sie wollen für alle asynchronen Rückruf Enden warten ist, sehen this answer, um weitere Informationen, im Grunde können Sie Ihren Code anpassen und verwenden Promise oder andere verwenden Implementierungen wie setInterval oder verwenden Sie eine Variable, um zu berechnen, wie viele Rückrufe bleiben.
+0

Datei auch einen Rückruf, aber es enthält sowohl Dateinamen und Änderungsdatum :), so dass keine Verbindung erforderlich! Danke für die Ausarbeitung von Schließungen, ich könnte dieses Konzept bald brauchen! – Arnoldiusss

0

Ich schlage vor, einen Blick auf Promise-basierte bro-fs Implementierung von HTML-Dateisystem-API zu werfen.
Um alle Einträge mit Metadaten lesen Sie etwas tun können:

fs.readdir('dir') 
    .then(entries => { 
    const tasks = entries.map(entry => fs.stat(entry.fullPath)) 
    return Promise.all(tasks); 
    }) 
    .then(results => console.log(results))