Я использую API файлов HTML5 для сборки данных составной формы для отправки 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 находится вне области видимости внутри обработчика reader.onload. Как бы я ни переделывал код, я, кажется, наткнулся на одно из этих препятствий, и я изо всех сил пытаюсь придумать изящный способ справиться с ним.
Какие-либо предложения?