文件API中的Javascript变量范围

时间:2012-08-24 05:37:26

标签: javascript scope fileapi

我有一个带有两个参数的函数: entry ,一个文件条目(来自拖放源),以及 fileName ,即所述文件的名称。< / p>

我不确定这是否有帮助,但条目被声明为:

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

我想创建一个描述有关此条目的信息的数组,该数组包括文件名,文件大小,以不同单位表示的文件大小以及用于表示所述文件的单位。我在两个不同的点上将我的数组打印到控制台,一旦进入.file方法(我道歉,如果我使用了不正确的术语),再次在外面。当数组不在.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);
}

1 个答案:

答案 0 :(得分:1)

.file()的调用是异步的。当调用最后一个fileData时,尚未填充console.log(fileData)。如果您想将fileData返回给来电者, 你还需要使getFileSize()异步:

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

  entry.file(function(f) {
    ...
    callback(fileData);
  });
}