2

entry 、(ドラッグ アンド ドロップ ソースからの) ファイル エントリ、およびそのファイルの名前fileNameの2 つの引数を取る関数があります。

これが役立つかどうかはわかりませんが、エントリは次のように宣言されています。

var entry = evt.dataTransfer.items[i].webkitGetAsEntry();

このエントリに関する情報を記述する配列を作成したいと思います。その配列には、ファイル名、ファイル サイズ、別の単位で表されるファイル サイズ、およびそのファイルを表すために使用される単位が含まれます。配列を 2 つの異なるポイントでコンソールに出力します。1 つは .file メソッドの内部 (間違った用語を使用している場合は申し訳ありません) で、もう 1 つは外部です。配列が .file メソッドの外にある場合、コンソールは配列の値を出力しません。

これを修正する方法と、これが発生する理由について助けを求めていただけますか? 変数を .file メソッドの外で宣言しているので、変数のスコープが正しいと思っていましたが、明らかにそうではありません。

これが私の機能です:

function getFileSize(entry,fileName)
{
    var fileData = [];
    var i = 0;
    var byteSize = ['B','kB','MB','GB','TB'];

    fileData.push(fileName);

    entry.file(function(file)
    {
        var fsize = file.size;
        var i = 0;
        fileData.push(fsize);

        while(fsize > 1024)
        {
            fsize = (fsize / 1024);
            i++;
        }

        fileData.push(fsize.toFixed(2));
        fileData.push(byteSize[i]);

        console.log(fileData);
    });

    console.log(fileData);
}
4

1 に答える 1

1

への呼び出し.file()は非同期です。最後のが呼び出されfileDataたとき、 はまだ設定されていません。console.log(fileData)呼び出し元に戻りたい場合は、非同期fileDataにする必要もあります。getFileSize()

function getFileSize(entry, fileName, callback) {
  ...
  var fileData = [];

  entry.file(function(f) {
    ...
    callback(fileData);
  });
}
于 2012-08-27T16:36:37.237 に答える