В HTML5 есть ли способ сделать readABinaryString () Filereader синхронным - PullRequest
4 голосов
/ 09 сентября 2011

Как дождаться завершения события загрузки

function(){

var filedata=null;     
reader.onload=function(e){
filedata=e.target.result;
};
reader.readAsBinaryString(file);

//I need code to wait till onload event handler gets completed.
return filedata;
}

Ответы [ 5 ]

3 голосов
/ 09 сентября 2011

Типичным решением этого является разделение вашего кода так, чтобы часть, которая использует загруженные данные, была в отдельной функции, которая затем вызывается из события.

Псевдо-code'ish:

function load() {
    //load here
    reader.onload = function(e) {
        process(e.target.result);
    }
}

function process(result) {
    //finish working here
}
2 голосов
/ 01 февраля 2013

Вы можете читать синхронно, используя потоки (веб-работники в Javascript).

http://www.w3.org/TR/FileAPI/#readingOnThreads

1 голос
/ 10 апреля 2016

Ответ Яни правильный, но в случае одновременного удаления нескольких файлов в droparea нет отдельных событий для каждого файла (насколько я знаю).Но идея может быть использована для загрузки файлов синхронно с помощью рекурсии.В приведенном ниже коде я загружаю количество файлов и объединяю их содержимое в одну строку для дальнейшей обработки.

var txt="", files=[];
function FileSelectHandler(e) {
    e.preventDefault();
    files = e.target.files || e.dataTransfer.files;
    txt=""; 
    readFile(0);
}

function readFile(n) {
    file=files[n];
    var reader = new FileReader();
    reader.onload = function() {
        txt += reader.result;
    }
    reader.readAsText(file);
    if (n<files.length-1) { readFile(n+1); }
    else { setTimeout(doWhatEver, 100);}
}

function doWhatEver(){
    outtext.innerHTML=txt; 
}    

Последний файл также требует немного дополнительного времени для загрузки.Следовательно, "setTimeout".

"outtext" является дескриптором текстовой области, где отображается вся строка.При выводе в textarea браузер не будет анализировать строку.Это позволяет просматривать не только текст, но и HTML, XML и т. Д.

1 голос
/ 10 января 2013
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.0.min.js"></script>

<form><input type="file" id="files" name="file" onchange="upload()" /></form>

function readFile(dfd) {
    bytes = [];
    var files = document.getElementById('files').files;
    if (!files.length) {
        alert('Please select a file!');
        return;
    }
    var file = files[0];
    var reader = new FileReader();

    // If we use onloadend, we need to check the readyState.
    reader.onloadend = function(evt) {
        if (evt.target.readyState == FileReader.DONE) { // DONE == 2
            var content = evt.target.result;
            //bytes = stringToBytes(content);
            dfd.resolve(content);
        }
    };
    reader.readAsBinaryString(file);
}

function upload() {
    var dfd = new $.Deferred();
    readFile(dfd);
    dfd.done(function(content){
        alert("content:" + content);
    });
}
0 голосов
/ 09 сентября 2011

нет там нет.Все операции ввода-вывода должны быть асинхронными в Javascript.

Синхронизация файловой операции эффективно блокирует поток пользовательского интерфейса браузера, замораживая браузер.Пользователям это не нравится.

Вместо этого вам нужно разработать свой сценарий асинхронно.Это довольно легко с Javascript.

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