Синхронные задачи (блокировка), как правило, плохие. Если нет реальной причины сделать это асинхронно, я настоятельно рекомендую вам использовать обратный вызов события.
Представьте, что ваш файл поврежден и HTML5 api cant читает, он не даст вам результат. Это нарушит ваш код и заблокирует сайт. Или кто-то может выбрать 10GB-файл, который заморозит вашу HTML-страницу, пока файл не будет полностью загружен. С помощью этого асинхронного обработчика событий вы сможете поймать возможные ошибки.
Чтобы обойти ограничения с обратными вызовами, я использую простой трюк:
var ready = false;
var result = '';
var check = function() {
if (ready === true) {
// do what you want with the result variable
return;
}
setTimeout(check, 1000);
}
check();
var reader = new FileReader();
reader.onloadend = function(evt) {
// file is loaded
result = evt.target.result;
ready = true;
};
reader.readAsDataURL(file);
функции проверки, проверяет каждую секунду, если готов переменный устанавливаются флаг истины. Если это так, вы можете быть уверены, что результат будет доступен.
Это может быть не самая лучшая практика, но я сделал webapp, используя эту технику примерно 30 раз с более чем 10 setTimeouts одновременно, и до сих пор не испытывал никаких проблем.
* «Я хотел бы синхронный метод». * Любая конкретная причина, почему? Я не думаю, что это возможно. –
У firefox есть/есть метод file.getAsDataURL(), но он устарел и был единственной версией синхронизации любого браузера afaik. – dandavis
Я хранил пути в локальной базе данных хранилища, мне нужно отправить изображения на сервер (с петлей на всех изображениях, поэтому мне нужен синхронный метод). Я хотел бы избежать хранения строк base64 в базе данных, чтобы не превышать ограничение локального хранения ... – Laila