Последовательный запуск XMLHttpRequest в приложении Cordova с асинхронным и ожидающим - PullRequest
0 голосов
/ 03 октября 2019

Кажется, я не понимаю, как работает async / await в контексте XMLHttpRequest (). Я могу написать функцию с обратными вызовами и заставить ее работать в ожидаемом порядке, но когда я использую следующее:

async function asyncLoadPartial(targetElementHandle,partial) {
        var xhr= new XMLHttpRequest();
        xhr.open('GET', partial, true);
        xhr.onreadystatechange = function(){
            if(this.readyState!==4){
                return false;
            }
            if(this.status!==200){
                return false;
            }
            //update the targetted element
            targetElementHandle.innerHTML= this.responseText;
            alert(1);
            return true;
        };
        xhr.send();
}

и вызываю внутри асинхронной функции:

async function other(){
    let dog = await asyncLoadPartial(el("mainContent"),partial);
    alert(2);
}

Iполучить предупреждение «2» перед предупреждением «1», когда я ожидал увидеть 1, а затем 2. Я прочитал Как я могу вернуть ответ от асинхронного вызова? и могу сделать пример с обещанием / тогда сработает, но я все еще хотел бы изучить async / await.

Я всегда использовал обратные вызовы с XMLHttpRequest, пока совсем недавно не использовал fetch, но в Cordova API извлечения, похоже, не поддерживается для извлечения локальных файловпотому что он выдает ошибку

Fetch API не может загрузить файл: /// android_asset / www / path. Схема URL "file" не поддерживается.

Я мог бы просто изменить xhr.open('GET', partial, true); на xhr.open('GET', partial, false); и запустить его синхронно, но меня беспокоит, что я не знаю, что я сделал выше.

Я могу заставить работать асинхронно / ожидать в других контекстах, но не здесь. Почему функция other () не ждет, прежде чем перейти к предупреждению?

1 Ответ

1 голос
/ 03 октября 2019

Это нормальное поведение, потому что XMLHttpRequest нежелателен, поэтому, если вы заметите, что внутри вашего асинхронного метода нет ключевого слова await, то метод будет работать синхронно, и alert(2) произойдет раньше, чем alert(1), потому что оповещение(1) будет происходить только при вызове обратного вызова. Таким образом, использование вами async и await в этом контексте является излишним. Придерживайтесь старого подхода обратного вызова, если вы не можете использовать API выборки.

...