0

在使用HTML5 FileSytem API的Chrome扩展im中。HTML 5 FileSytem,将FileEntry与来自回调的元数据数组结合使用

Im检索文件夹中的记录列表。

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. 

} 

的FileEntry的对象不包含元数据,我需要的最后修改日期。我能够检索元数据的对象

function addMeta(entries) { 
    for (var i = 0; i < entries.length; i++) { 
     entries[i].getMetadata(function (metadata) { 
      console.log(entries); 
      console.log(metadata); 
     }); 
    } 
} 

问题是我在回调中获取元数据。 如何加入两个对象,确保正确匹配? 简化的结果即时寻找的是:

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

回答

2
  1. 要获得lastModifiedDate,你并不需要使用getMetadata,为每this question的说明,只是用entry.file.lastModifiedDate,但也许file()是另一个回调。
  2. 要“加入确保正确匹配的两个对象”,由于Closures,您可以使用以下代码来获得正确的结果。 (假设数据结构是[[entry, metadata]]正如你所提到)

    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. 如果你想要的是等待所有异步回调结束,看到this answer更多细节,基本上你可以调整你的代码,并使用Promise,或者使用其他像setInterval这样的实现,或者使用一个变量来计算剩余的回调数。
+0

文件也是一个回调,但它同时包含文件名和修改日期:),所以不需要加入!感谢您详细阐述关闭,我很快就会需要这个概念! – Arnoldiusss

0

我建议看看基于Promise的bro-fs实现HTML文件系统API。
读取与元数据的所有条目,你可以做这样的事情:

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