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

MapDataalertajax呼び出しがまだ実行されている間に実行され(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. Ajaxコール
  2. alert(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/

于 2012-06-04T11:37:58.140 に答える