2012-02-09 63 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時,尚未設置成功功能。

根據您要完成的操作,可以將警報放在成功回調中。

相關問題