首先查看示例然后您就可以理解我的问题了。
var x;
function checkTime() {
$.ajax({
type: 'GET',
url: 'http://www.example.com/time.php',
data: test,
dataType:'json',
success: function (data) {
if (data == 0){
x = 'true';
} else if (data == 1){
x = 'false';
}
}
});
}
checkTime();
alert (x);
警报将为undefined
我需要在x
函数中设置checkTime
并将其抓取到函数之外
即使我这样做:
var x = checkTime();
alert (x);
我仍然得到undefined
我也只需要检查是真还是假,也许还有另一种方法可以做。我也尝试过:
...
if (data == 0){
return true;
} else if (data == 1){
return false;
}
...
但我不知道如何检查。
基本上我需要这样的东西:
if(x == 1){// if(x == true) //做一点事 }
任何想法?
感谢
答案 0 :(得分:4)
这是因为.ajax()
的默认行为是异步。在x
点火之前,alert()
不会被设置。您需要将.ajax()
设置为aync=false
或传入回调函数以在Ajax请求完成时调用,例如
function checkTime(callback) {
$.ajax({
type: 'GET',
url: 'http://www.example.com/time.php',
data: test,
dataType:'json',
success: function (data) {
var x = '';
if (data == 0){
x = 'true';
} else if (data == 1){
x = 'false';
}
// Call the callback function with 'x'
callback.call(null, x);
}
});
}
然后使用它如下:
checkTime(function (x) {
alert(x);
});
答案 1 :(得分:2)
这是因为AJAX是异步的。当您的代码达到警报时,AJAX请求的成功函数尚未执行。您可以尝试将ajax请求设置为async:false,或者在success函数内部设置警报。
答案 2 :(得分:1)
您无法直接访问为“成功”定义的函数的返回值;首先,您应该知道这里涉及两个函数:checkTime
,以及ajax调用成功事件的未命名事件处理函数。您想要从该未命名的事件处理函数中检索一个值;但是,该函数不是直接从checkTime
调用的,但是当AJAX请求返回时(它是event-driven programming:当事件 AJAX调用成功时,执行function (data) {...}
)。
在您的示例中,执行alert
后调用的checkTime
通常会在AJAX请求完成之前调用;这是因为AJAX请求发生异步,因此调用成功的事件还没有发生。如果您总是希望等待请求的答案,则可以禁用AJAX调用的异步性(async:false);但也许您也可以直接在事件处理程序中而不是在外部进行区分。如果你想要遵循事件驱动的编程范例,这将是一种方法。
如果您想在请求运行时继续执行其他操作,您的选项还包括:使用一些其他(例如全局)变量作为成功函数AJAX调用的“返回值”(可能还有一秒用于指示调用是否已完成),并定期检查它是否已设置(但不会跟随事件驱动的编程范例,可能被认为是不好的做法,因为需要不必要的频繁轮询变量。)
答案 3 :(得分:0)
这是因为checkTime()
在执行成功函数之前立即返回。成功函数在ajax调用完成之后才会执行,因此当您尝试使用它时,x
尚未设置。
根据您要完成的操作,您可以将警报置于成功回调中。