0

HTML5 FileSytem APIを使用するChrome拡張機能で。HTML5 FileSytem、FileEntryとコールバックのMetaData配列を組み合わせる

フォルダ内のレコードのリストを取得しています。

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); 
     }); 
    } 
} 

問題は、私はコールバックでメタデータを取得することです。 どのようにして2つのオブジェクトを結合して、適切なマッチが行われたことを確認できますか?探し 簡略化した結果イムは、次のとおりです。

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

答えて

2
  1. も、LastModifiedDateは取得するには、多分file()は別のコールバックですが、あなたは、単にentry.file.lastModifiedDateを使用し、this questionの説明に従って、getMetadataを使用する必要はありません。
  2. Closuresのために「2つのオブジェクトを結合して正しいことを確認する」には、次のコードを使用して正しい結果を得ることができます。 (あなたが言及したようなデータ構造を仮定すると[[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. 何が欲しいのは基本的に、あなたのコードを調整し、Promiseを使用するか、または他を使用することができ、より多くの詳細についてはthis answerを参照してください、すべての非同期コールバックが終了するのを待つのであればsetIntervalのような実装を使用するか、変数を使用してコールバック数を計算します。
+0

ファイルには、コールバックですが、それは、ファイル名や更新日:)の両方が含まれているので、何の参加は必要ありません:あなたはこのような何かを行うことができ、メタデータを持つすべてのエントリを読み込むために
!閉鎖を精緻化してくれてありがとう、私はすぐにこのコンセプトが必要かもしれない! – Arnoldiusss

0

私は、Promisesベースのbro-fs HTML Filesystem APIの実装について見てみることをお勧めします。

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