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)) 
相關問題