Область видимости переменных Javascript в файловом API

У меня есть функция, которая принимает два аргумента: 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);
}

person frshca    schedule 24.08.2012    source источник


Ответы (1)


Вызов .file() является асинхронным. fileData еще не было заполнено, когда вызывается последний console.log(fileData). Если вы хотите вернуть fileData вызывающей стороне, вам также необходимо сделать getFileSize() асинхронным:

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

  entry.file(function(f) {
    ...
    callback(fileData);
  });
}
person ebidel    schedule 27.08.2012
comment
Извините за поздний ответ! Я не знал о обратных вызовах, узнал что-то новое :) - person frshca; 26.09.2012