这可能真的很愚蠢但我找不到我的代码的问题。它获取一个返回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 {}
,但它也没有用。
那我缺少什么?
谢谢:)
答案 0 :(得分:4)
问题来自于$.getJSON()
调用是异步的。一旦ajax请求被触发,处理继续在getit()
内部,并且您的函数立即返回false。稍后,Ajax响应会返回并设置user
,但很久以前您的getit()
函数return
已经编辑!
您可以使用async
选项强制Ajax调用同步,如下所示:
$.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()
完成时执行。
答案 1 :(得分:2)
Ajax是异步的,这意味着脚本的其余部分不会坐下来等待它继续前进。如您的示例所示,在ajax函数从服务器接收响应之前,正在到达return
行,因此用户变量在该时间点仍为false。
如果要强制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;
}
});