0

我知道这个问题已经被问过百万次了,所以我很抱歉。

我查看了所有其他示例,但我不明白为什么以下代码现在不起作用。

当我将它放在 CheckinMap 函数之外时,我得到未定义的警报框。

为什么?

$(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);
    }); 
4

2 回答 2

7

MapData未定义,因为在alertajax 调用仍在运行时执行(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) })
于 2012-06-04T11:24:08.123 回答
0

执行顺序是异步的。目前执行以下步骤:

  1. 阿贾克斯调用
  2. 警报(地图数据);// 未知
  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/

于 2012-06-04T11:37:58.140 回答