【问题标题】:asynchronous xml request doesn't return异步 xml 请求不返回
【发布时间】:2015-04-07 04:21:59
【问题描述】:

所以我正在尝试将同步 xm​​l 请求重写为异步 xml 请求。我对此很陌生,所以如果错误真的很愚蠢,请原谅我。

无论如何,这就是我目前所拥有的。

var getEmployeeData = function(section, question, column){
    var xhr = new XMLHttpRequest();
    xhr.open("GET", Data.contextPath + "/main/?action=get-employee-list&section=" +section+ "&question=" +question+ "&column=" +column, true)
    xhr.onload = function (e) {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                if (employeeDataDone) {
                    if (xhr.responseText==("\r\n")) {
                        employeeList = null;
                        employeeInverseList = null;
                    } else {
                        employeeList = JSON.parse(xhr.responseText)[0];
                        employeeInverseList = JSON.parse(xhr.responseText)[1];
                    }
                }
            } else {
              console.error(xhr.statusText);
            }
          }
    }.bind(this);
    xhr.onerror = function (e) {
        console.error(xhr.statusText);
    };
    xhr.send(null);
}.bind(this);

感谢您提供任何帮助,如果您需要任何我忽略的额外信息,请直接询问。

谢谢!

【问题讨论】:

  • 为什么要检查 onload 里面的 4 和 200?
  • @epascarello 我不知道,对不起,我对此很陌生。可以去掉吗?
  • @epascarello 他在 XHR 对象上使用了错误的方法名称。在请求的整个生命周期中以不同的状态多次调用正确的方法名称。

标签: javascript xml servlets asynchronous request


【解决方案1】:

您应该监听 onreadystatechange 事件或将具有该名称的函数附加到对象。以下应该可以解决您的问题:

var getEmployeeData = function(section, question, column){
    var xhr = new XMLHttpRequest();
    xhr.open("GET", Data.contextPath + "/main/?action=get-employee-list&section=" +section+ "&question=" +question+ "&column=" +column, true)
    xhr.onreadystatechange = function (e) {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                if (employeeDataDone) {
                    if (xhr.responseText==("\r\n")) {
                        employeeList = null;
                        employeeInverseList = null;
                    } else {
                        employeeList = JSON.parse(xhr.responseText)[0];
                        employeeInverseList = JSON.parse(xhr.responseText)[1];
                    }
                }
            } else {
              console.error(xhr.statusText);
            }
          }
    }.bind(this);
    xhr.onerror = function (e) {
        console.error(xhr.statusText);
    };
    xhr.send(null);
}.bind(this);

编辑: 有关更多详细信息,我建议您查看 Wikipedia entry for XMLHttpRequest。

【讨论】:

  • 哦,哇,我完全记得在某个地方看到过。我想我忘了将我的 onload 更改为 onreadystatechange。太棒了,谢谢马克!
  • 我完全发现自己不时为忘记 API 名称而摸不着头脑。至于您似乎在天空中的巨大比特桶中丢失的其他响应,我会在您的 onreadystatechange 方法的主体中调用您的数据到 DOM 绑定消息。如果您发现答案有帮助,请投票。您也可以投票响应!这会奖励那些帮助过你的人。此外,如果某个答案解决了您的问题,您可以将其标记为已回答,从而为您自己和回答的人加分。
  • 是的,我不知道我上次的回复发生了什么。我将如何进行 DOM 绑定?还投了赞成票并给了你一个复选标记:)。
  • 取决于您的应用程序以及您希望生成的标记是什么。如果您使用 jQuery,您可以通过 append 方法轻松地将标记片段传递给元素;如果你使用的是纯 JS,你应该使用元素的目标元素的 innerHTML 属性[最简单的方法是 document.getElementById(idAttributeValue)]。
  • 对不起,我不太明白。如果我只是使用 document.getElementById(id) 添加到元素,当我还没有从服务器收到信息时,这对我有什么帮助?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
相关资源
最近更新 更多