2013-04-02 51 views
0

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

TypeError: obj is undefined

我已经研究了好几个小时,但一直没能找到工作的解决方案。

代码:

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的响应选项卡,则表明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功能(在页面加载),控制台.log声明xmlhttp.response是一个空字符串。对'txt'和'obj'做typeof返回undefined。我试图访问该对象的元素,如:

obj.nameobj.state.on

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

如果我遗漏了任何重要信息,请让我知道。感谢您的任何帮助,您可以提供!

+0

是“桥”(服务器)的相同或不同的计算机名(和港口) ? – granadaCoder

+4

在eval('。叹息...'后停止阅读... – AlienWebguy

+1

AJAX中的第一个A代表**异步** – Pointy

回答

2

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

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

更改xmlhttp.open呼叫,使得该呼叫是同步的(即,脚本等待直到HTTP响应继续之前接收到的):

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

谢谢你谢谢你!这工作就像一个魅力! – user2234193

+0

不客气。 –

+2

请记住,在大多数情况下,由于可用性原因,同步请求通常被认为是一个非常糟糕的主意,因为在请求完成之前浏览器窗口将被冻结。 – Pointy