Проблемы с совпадением с Javascript - мне нужен способ, чтобы проверить, закончилась ли загрузка файла - PullRequest
0 голосов
/ 07 августа 2011

Привет пользователям и читателям stackoverflow, Я программирую довольно легко с помощью JS для Firefox / Gecko 2.x и столкнулся с проблемой, которая немного далека от моих знаний. Дело в том, что я читаю содержимое файла в строку, используя следующий код:

NetUtil.asyncFetch(my_file, function(inputStream, status) {
                    if (!Components.isSuccessCode(status)) {
                        return;
                    }
my_string = NetUtil.readInputStreamToString(inputStream, inputStream.available());
]);

И сразу после прочтения файла я оцениваю следующее условие:

if (my_string.length == 0) {
    //do something...
} else {
    //do something else...
}

ОК, проблема в том, что, хотя в файле есть некоторые символы, если это первый запуск скрипта, он всегда будет переходить к первому условию, потому что у него недостаточно времени для чтения файла и загрузки символы в строке. При втором запуске глобальная переменная my_string имеет ранее полученное значение, поэтому она перейдет в состояние «else». Вопрос в том, как я могу прослушать событие «файл завершен при загрузке» в JavaScript, чтобы предотвратить такое поведение? Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 07 августа 2011

Здравствуйте, я не знаком с NetUtil из Firefox / Gecko 2.x, но концепция выглядит знакомой.

Я предполагаю, что это потому, что

 NetUtil.asyncFetch

вызов функции обратного вызова после

if (my_string.length == 0) {
//do something...
} else {
//do something else...
} 

почему бы вам не попробовать использовать данные в правильном месте

    NetUtil.asyncFetch(my_file, function(inputStream, status) {
                if (!Components.isSuccessCode(status)) {
                    return;
                }
    my_string = NetUtil.readInputStreamToString(inputStream, inputStream.available());

    alert(my_string.length);  //is here is also be 0 ???????
    //do some stuff with the data
 ]);
0 голосов
/ 07 августа 2011

Поскольку выборка асинхронна, обычно my_string пусто.Вам нужно подписаться на какое-то пользовательское событие или как-то передать обратный вызов.

NetUtil.asyncFetch(my_file, function(inputStream, status) {
    if (!Components.isSuccessCode(status)) {
        return;
    }
    my_string = NetUtil.readInputStreamToString(inputStream, inputStream.available());
    var evt = document.createEvent('Event');
    evt.initEvent('inputReady', true, true);
    evt.my_string = my_string;
    document.dispatchEvent(evt);
});

, а затем подписаться на это событие

document.addEventListener('inputReady', function(e){
    alert(e.my_string);
});

PS Не проверено

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