2012-06-04 241 views
0

我知道這個問題已經被問過百萬次了,所以我的道歉。聲明全局變量

我看了所有其他的例子,我不明白爲什麼下面的代碼現在不工作。

當我將它放在CheckinMap函數之外時,我得到了未定義的警報框。

爲什麼?因爲雖然Ajax調用仍在運行alert執行

$(document).ready(function() { 
    var MapData; 
     $(function CheckinMap() { 
       $.ajax({ 
        type: "GET", 
        url: "content/home/index.cs.asp?Process=ViewCheckinMap", 
        success: function (data) { 
         MapData = data; 
        }, 
        error: function (data) { 
         $("#checkinmap").append(data); 
        } 
       }); 
      }); 
    alert(MapData); 
    }); 
+1

只是出於好奇,既然你已經看了無數其他的答案,他們基本上都說「因爲'成功'函數將在未來的任意時間執行',那麼妨礙理解的問題是什麼?我並不想失禮,我只是想知道,因爲這是一個我很難定期教人的概念,如果可能,我想簡化流程。感謝您的任何輸入:) –

回答

7

MapData是不確定的(AJAX是異步)和響應尚不可用。因此,更改代碼以這種方式

success: function (data) { 
     MapData = data; 
     alert(MapData); 
}, 

或繼續執行代碼調用另一個函數

success: function (data) { 
     continueExecution(data) 
}, 
... 

function continueExecution(data) { 
    alert(data) 
} 

或遞延對象(jQuery的1.5+)

$.ajax({ 
    type: "GET", 
    url: "content/home/index.cs.asp?Process=ViewCheckinMap" 
}) 
.done(function(data) { alert(data) }) 
0

執行順序異步。目前,執行下列步驟:

  1. Ajax調用
  2. 警報(屬於MapData); //未知
  3. 成功功能設置屬於MapData(或者甚至不設置在屬於MapData誤差函數)

你可以提醒在成功的功能(如建議),但你不知道該變量是該函數的本地變量,或者實際上是全局變量。爲了測試MapData是否實際上是全局的,你可以使用setTimeout來提醒變量返回。

看看這個修改後的示例代碼:

// Global variable 
var MapData; 

// Global function 
function test() { 
    alert(MapData); 
} 

$(document).ready(function() { 
    $.ajax({ 
     type: "GET", 
     url: "http://www.google.nl", 
     success: function (data) { 
      MapData = data; 

      // Call global function with timeout 
      setTimeout(test, 10); 
     }, 
     error: function (data) { 
      $("#checkinmap").append(data); 

      // Set error message instead of data (for testing)    
      MapData = 'error'; 

      // Call global function with timeout 
      setTimeout(test, 10); 
     } 
    }); 
}); 

或者,你可以在這裏測試一下:http://jsfiddle.net/x9rXU/