XML请求中的数组不是全局的

时间:2016-11-14 06:14:04

标签: javascript xml

我正在请求从表老师那里获取名称并且我收到的响应很好,但是下面代码中的Teachers数组无法从显示Teachers.length = 0的其他函数访问。这是由于某种延迟处理XML请求,请解释一下,谢谢。

document.onreadystatechange = function () {
if (document.readyState === "complete") { // PAGE HAS BEEN LOADED

  Teachers = [];
  var object = [];
  var request = new XMLHttpRequest();
  request.onreadystatechange = function() {
    if (request.readyState === XMLHttpRequest.DONE) {
      if (request.status === 200) {
        object = JSON.parse(request.responseText);
        for(var i = 0 ; i < object.length; i++){
          Teachers.push(object[i].name.toString());
          console.log("*" + Teachers.length);
        }
      }
      console.log(Teachers.length);
    }
  };

  request.open('GET', 'http://localhost:3000/names', true);
  request.send(null);

  CreateRow();
  for(var i = 0; i < absentTeachers.length; i++){
    PrepareRow(i, "row"+(i+1));
  }
}}

像CreateRow这样的函数正在使用教师,但是它显示为空,但是当我在请求处理函数中记录教师长度时,它会显示更改。

1 个答案:

答案 0 :(得分:2)

您的代码遇到了问题,因为您期望同步功能。但是,Ajax请求是异步处理的。

通常情况下,JS从代码顶部开始,然后运行到底部。这是您习惯的功能。如果您的请求将同步处理,您的代码将毫无问题地工作。但是:Javascript从顶部开始,获取请求,将其发送出去并继续执行其余代码。此时,您的Teachers数组仍为空,因此不会发生任何事情。

您需要做的是等到请求完成并且数据可用。 (您可能会注意到,在获取填充数组的日志之前,具有空数组的console.log发生了。

这种情况发生的原因是,一旦您的请求到达该点,您就会调用console.log。 (再次,请求内部从上到下)。因此,要解决您的问题,请创建一个函数,然后在Ajax请求中调用该函数。

document.onreadystatechange = function () {
if (document.readyState === "complete") { // PAGE HAS BEEN LOADED

  Teachers = [];
  var object = [];

  function createRow() {
    for(var i = 0; i < absentTeachers.length; i++){
      PrepareRow(i, "row"+(i+1));
    }
  }

  var request = new XMLHttpRequest();
  request.onreadystatechange = function() {
    if (request.readyState === XMLHttpRequest.DONE) {
      if (request.status === 200) {
        object = JSON.parse(request.responseText);
        for(var i = 0 ; i < object.length; i++){
          Teachers.push(object[i].name.toString());
          console.log("*" + Teachers.length);
        }
      }
      createRow();
    }
  };

  request.open('GET', 'http://localhost:3000/names', true);
  request.send(null);
}}

我希望这能解决你的问题。