JSON响应未定义:使用XMLHttpRequest

时间:2013-04-02 20:37:55

标签: javascript json get xmlhttprequest

我正在使用XMLHTTPRequest来获取JSON响应。当我在Firebug中查看Response选项卡时,它会显示我在jsonlint上验证的JSON对象。当我尝试访问对象的属性时,我得到了

  

TypeError:obj未定义

我已经研究了几个小时,但未能找到可行的解决方案。

代码:

function getState(light) {
  var txt = execute('GET', 'http://' + bridge + '/api/' + hash + '/lights/' + light);
  var obj = eval('(' + txt + ')');
  //var obj = JSON.parse(txt);
  //this gives me "SyntaxError: JSON.parse: unexpected character"
  console.log(obj.name);
}

function execute($method, $url, $message) { //used for both PUT and GET requests
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.open($method, $url, true)
  xmlhttp.send($message);
  console.log(xmlhttp.response);
  return xmlhttp.response;
}

在Firebug Response选项卡中,它表示GET请求的响应:200 OK -4ms

{
  "state": {
    "on": false,
    "bri": 200,
    "hue": 8664,
    "sat": 140,
    "xy": [0.4932, 0.3832],
    "ct": 428,
    "alert": "none",
    "effect": "none",
    "colormode": "hs",
    "reachable": true
  },
  "type": "Extended color light",
  "name": "Left rear living room 1",
  "modelid": "LCT001",
  "swversion": "65003148",
  "pointsymbol": {
    "1": "none",
    "2": "none",
    "3": "none",
    "4": "none",
    "5": "none",
    "6": "none",
    "7": "none",
    "8": "none"
  }
}

当我调用getState函数(在pageload上)时,console.log声称xmlhttp.response是一个空字符串。在'txt'和'obj'上执行typeof会返回undefined。我正在尝试访问对象元素,例如:

obj.nameobj.state.on

我是使用JSON和XMLHttpRequest的新手 - 我的代码基于其他人最初创建的模板。我使用上述函数在我的程序中的其他地方使用的PUT请求没有问题,但似乎无法让GET请求正常工作。

如果我遗漏了任何重要信息,请告诉我。感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:2)

您的XML HTTP请求被设置为异步(即,脚本不会等到收到响应并在HTTP请求在后台发生时继续)。

这意味着在您返回之前没有足够的时间来存在xmlhttp.response。因此,txt未定义,因此obj未定义,正如错误消息所述。

更改xmlhttp.open调用以使调用同步(即脚本等待,直到收到HTTP响应,然后继续):

xmlhttp.open($method, $url, false); // true => asynchronous, false => synchronous