javascript - 使用 async 和 wait 在 Cordova 应用程序中顺序运行 XMLHttpRequest

标签 javascript async-await xmlhttprequest

我似乎不明白 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);
}

当我期望看到 1 然后是 2 时,我在警报“1”之前收到警报“2”。我读了 How do I return the response from an asynchronous call?并且可以使用 Promise/then 来制作示例,但我仍然想学习 async/await。

我总是使用 XMLHttpRequest 的回调,直到最近我使用 fetch,但在 Cordova 中,fetch API 似乎不支持拉取本地文件,因为它会给出错误

Fetch API cannot load file:///android_asset/www/path. URL scheme "file" is not supported.

我可以将 xhr.open('GET',partial, true); 更改为 xhr.open('GET',partial, false); 并运行它是同步的,但不知道上面做错了什么让我很困扰。

我可以让 async/await 在其他上下文中工作,但在这里不行。为什么 function other() 在进入警报之前不等待?

最佳答案

这是正常行为,因为 XMLHttpRequest 不可等待,因此如果您注意到异步方法内部没有关键字 await,因此该方法将同步运行并且 alert(2) 将在 alert(1) 之前发生,因为alert(1) 仅在调用回调时才会发生。因此,在这种情况下使用 async 和 wait 是多余的。如果您无法使用 fetch api,请坚持使用旧的回调方法。

关于javascript - 使用 async 和 wait 在 Cordova 应用程序中顺序运行 XMLHttpRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58223520/

相关文章:

javascript - Express >4.0 版本的 Socket.io 和 Node.js

node.js - 将 session 描述从 Node 服务器发送到客户端

javascript - 如何检测 Chrome 应用程序中的 XMLHttpRequest 错误

selenium-webdriver - 当函数没有返回值时,使用页面对象模型返回 promise 或在函数中使用 async/await 是更好的做法

node.js - 意外的 token 异步 ()

typescript - "Inject"带有异步/等待的回调

angularjs - Angular 2 : PrimeNG - XHR error (404 Not Found)

javascript - 我如何检测(并纠正?)跨浏览器的各种滚动条可见性?

javascript - 在gruntjs中使用requirejs构建一个库,并在其他项目中使用

javascript - Chart.js Canvas : can't center it