2010-04-17 96 views
2

这可能真的很愚蠢,但我找不到我的代码的问题。它获取返回JSON的URL,然后该函数应该返回一个字符串:

function getit() { 
    var ws_url = 'example.com/test.js'; 
    var user = false; 

    $.getJSON(ws_url, function(data) { 
    alert('user '+data.user);//shows john 
    user = data.user || false; 
    }); 

    return user;//should return john but returns false 
} 

test.js都会有这样的事情:

{"id":"12","username":"ses","user":"john","error":""} 

或像这样:

{"error":"123"} 

我也试过if (data.user) {} else {}但它也没有工作..

所以我错过了什么?

谢谢:)

回答

4

的问题来自于一个事实,即$.getJSON()调用是异步的。一旦ajax请求被触发,处理继续在getit()之内,你的函数立即返回false。稍后,Ajax响应会返回并设置user,但很久以前您的getit()函数return已编辑!

您可以强制Ajax调用使用async选项,这样是同步的:

$.ajax({ 
    async: false, 
    url: ws_url, 
    type: "GET", 
    success: function(data) { 
     alert('user '+data.user);//shows john 
     user = data.user || false; 
    } 
    }); 

如果你这样做,你的浏览器将在脚本块,直到Ajax调用返回。通常这不是理想的行为(这就是为什么默认值为async: true),所以我建议重新调用它,即调用getit(),并且期望在可能的时候处理它的结果,也许通过传递它自己的回调函数到getit(),然后在getit()完成时执行。

2

阿贾克斯是异步的,这意味着脚本的其余部分是不会坐下来等待它在移动之前完成。和你的例子一样,在ajax函数接收到来自服务器的响应之前,return行已经到达,因此用户变量在那个时间点仍然是错误的。

如果要强制ajax调用同步运行,可以使用jQuerys $.ajax方法并将async参数设置为false。

$.ajax({ 
    url:ws_url, 
    dataType:"json", 
    async:false, 
    success:function(data){ 
    alert('user '+data.user);//shows john 
    user = data.user || false; 
    } 
});