【问题标题】:Javascript variable scope in file API文件 API 中的 Javascript 变量范围
【发布时间】:2012-08-24 05:37:26
【问题描述】:

我有一个函数,它接受两个参数:entry,一个文件条目(来自拖放源)和 fileName,该文件的名称。

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

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

【问题讨论】:

    标签: javascript scope fileapi


    【解决方案1】:

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

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

    【讨论】:

    • 抱歉回复晚了!我不知道回调,学到了一些新东西:)
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2012-12-23
    相关资源
    最近更新 更多