Функция JS возвращает ноль - помощь - PullRequest
4 голосов
/ 09 июля 2011

Я пытаюсь изменить пример http://www.html5rocks.com/en/tutorials/file/dndfiles/#toc-reading-files, чтобы сделать функцию handleFileSelect (evt) return reader.result; Я имею в виду сделать функцию, возвращающую base64 для изображения или около того. Я пытался написать это с помощью функции, но он возвращает только ноль :( Итак, мой вопрос, как заставить функцию возвращать base64?

На данный момент я попытался написать этот фрагмент ...

function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // Loop through the FileList and render image files as thumbnails.
    for (var i = 0, f; f = files[i]; i++) {

      // Only process image files.
      if (!f.type.match('image.*')) {
        continue;
      }

      var reader = new FileReader();

      // Closure to capture the file information.
      reader.onload = (function(theFile) {
        return function(e) {
          // Render thumbnail.
          var span = document.createElement('span');
          span.innerHTML = ['<img class="thumb" src="', e.target.result,
                            '" title="', theFile.name, '"/>'].join('');
          document.getElementById('list').insertBefore(span, null);
        };
      })(f);

      // Read in the image file as a data URL.
      reader.readAsDataURL(f);
    }
    return reader.result;
  }

Все полезные комментарии приветствуются:)

1 Ответ

2 голосов
/ 09 июля 2011

Я не знаю объекта FileReader в деталях, но похоже, что он читает данные из URL асинхронно.Это означает, что когда ваша функция возвращает reader.result, объект FileReader еще не завершил чтение файла.Это не заканчивается до тех пор, пока не будет вызван обратный вызов onload (или возникнет какое-либо другое состояние ошибки).

Итак, ваша функция возвращается, пока чтение все еще происходит асинхронно.Таким образом, результат еще не определен.Результат будет доступен на стороне обратного вызова onload или (я предполагаю), внутри других обратных вызовов, которые будут указывать на условия ошибки (onabort, onerror и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...