【问题标题】:XMLHttpRequest open function's async event listenerXMLHttpRequest 打开函数的异步事件监听器
【发布时间】:2013-01-25 10:45:21
【问题描述】:

我正在使用下面的代码向 API 发出 POST 请求并从服务器获取一些数据

    request.open("POST", url, true);
    request.setRequestHeader("Content-type", "application/json; charset=UTF8");
    request.setRequestHeader("X-Accept", "application/json");
    request.send(JSON.stringify(data));

我的问题是如何决定我应该异步还是同步。好吧,实际上我的异步问题是我不确定如何应用一个 eventListener 来监听该 XHR 的完成情况。

如果我使用异步调用,我的 Web 应用程序获取数据太晚,并且应用程序加载了以前的缓存数据,但如果我使用同步调用,获取和显示数据大约需要一秒钟,我不确定如何显示“加载”图标,因为我不确定在哪里附加 eventListener。

有人能说清楚如何正确使用 XHR 吗?

我想提一下,这是我第一次尝试使用 XHR 通过 API 从服务器获取数据。

【问题讨论】:

    标签: javascript asynchronous xmlhttprequest synchronous event-listener


    【解决方案1】:

    坚持使用异步,因为它不会冻结浏览器并允许以更优雅的方式处理响应。至于XHR的补全,用这个:

    request.open("POST", url, true);
    request.onreadystatechange = function () {
        if (request.readyState === 4) {
            // XHR state is DONE
            if (request.status == 200) {
                // HTTP 200 status code (success)
                // HIDE YOUR "LOADING" SPINNER
                // use request.responseText to get the response's content
            }
        }
    };
    request.setRequestHeader("Content-type", "application/json; charset=UTF8");
    request.setRequestHeader("X-Accept", "application/json");
    request.send(JSON.stringify(data));
    // SHOW YOUR "LOADING" SPINNER
    

    与往常一样,最好阅读一些关于它的文档:https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest

    “我的 Web 应用程序获取数据太晚,并且应用程序加载了以前的缓存数据” - 我不确定你的意思是什么,但如果你进一步解释上面的代码是如何被调用/使用的,我确信它可以重新组织以正常协同工作。

    【讨论】:

    • 感谢您的快速回答! “我不确定你的意思是什么,但如果你解释一下上面的代码是如何被调用/使用的,我相信它可以重新组织以正常工作。”我发现了问题所在,我没有正确传递数据。
    • 没问题!听起来不错,如果您需要更多帮助或有更多问题,请告诉我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 2018-05-16
    • 2016-07-30
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 2017-02-24
    相关资源
    最近更新 更多