Я использую HTML5 File API для сбора многокомпонентных данных формы для отправки XHR в веб-сервис. У меня есть все, что работает в FF, который имеет хороший удобный метод getAsBinary (), включенный в их реализацию файлового API. Это была довольно приятная сделка. В основном пошло:
var const; // constructor
const += headers;
const += field_data;
for(var i = 0; i < files.length; i++)
{
const += files[i].getAsBinary();
}
sendData(const);
работал как шарм.
Чтобы заставить его работать в Chrome, мне нужно создать объект FileReader, который обрабатывает немного по-другому. Я по сути должен идти:
var const; // constructor
const += headers;
const += field_data;
var reader = new FileReader();
for(var i = 0; i < files.length; i++)
{
reader.onload = (function(file)
{
const += file.target.result; // const is not in scope in this anonymous function!
}
reader.readAsBinaryString(files[i]);
}
sendData(const);
Что не работает, по двум основным причинам. Во-первых, чтение происходит асинхронно, поэтому к тому времени, когда оно попадает в функцию sendData (), данные файла не записываются в переменную const. Во-вторых, переменная const находится вне области видимости внутри обработчика reader.onload. Тем не менее, я заново настраиваю код, я, кажется, сталкиваюсь с одним из этих препятствий, и я изо всех сил пытаюсь найти изящный способ справиться с ним.
Есть предложения?