2012-02-09 106 views
0

先看例子,然后你就可以理解我的问题。如何在JavaScript函数中设置和返回一个变量?

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

我需要设置xcheckTime功能内,抓住它的功能外

即使我做的:

var x = checkTime(); 
alert (x); 

我仍然得到undefined

我也只需要检查真假,也许还有另一种办法。我也试过:

... 
if (data == 0){ 
    return true; 
} else if (data == 1){ 
    return false; 
} 
... 

但我不知道如何检查。

基本上我需要这样的东西,如:

如果(X == 1){//如果(X ==真) //做一些 }

什么想法?

谢谢

+0

的变量被定义为你所期望的,但AJAX功能是异步的变量没有被提醒您注意它的时间来定义。 – Niklas 2012-02-09 09:06:20

回答

4

发生这种情况是因为.ajax()的默认行为是异步。当您的alert()发生火灾时,x将不会被设置。您需要将.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); 
}); 
2

这是因为AJAX是异步的。当您的代码达到警报时,AJAX请求的成功功能尚未执行。您可以尝试将ajax请求设置为async:false,或者在成功函数内部发出警报。

+0

是的。另外,'checkTime'本身不会返回任何东西,所以'x = checkTime()'的结果自然会归结为undefined。 – 2012-02-09 09:08:59

1

您不能直接访问为“成功”定义的函数的返回值;首先您应该知道这里涉及到两个函数:checkTime,以及ajax调用成功事件的未命名事件处理函数。您想从该未命名的事件处理函数中检索一个值;然而,该函数并不直接从checkTime调用,但是当AJAX请求返回时(它是event-driven programmingfunction (data) {...}在事件AJAX调用成功发生时执行)。

在你的例子中,执行checkTime后调用的alert通常会在AJAX请求完成之前调用;这是因为AJAX请求异步发生,因此调用成功的事件不需要发生。如果您始终想要等待请求的答案,则可以禁用AJAX调用的异步性(async:false);但也许你也可以直接在事件处理程序中而不是在外面做你想做的事情。如果你想遵循事件驱动的编程范例,那将是一条路。

如果您希望在请求运行时继续执行其他操作,那么您的选项还包括使用其他(例如全局)变量作为成功函数AJAX调用的“返回值”(可能还有第二个用于指示调用是否完成),并定期检查它是否已设置(但不会遵循事件驱动的编程范例,并且可能被认为是不好的做法,因为它不需要频繁轮询变量)。

0

发生这种情况是因为checkTime()在执行成功函数之前立即返回。直到ajax调用完成后才能执行成功功能,所以当您尝试使用x时,尚未设置成功功能。

根据您要完成的操作,可以将警报放在成功回调中。

相关问题