2012-06-04 4 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); 
}, 

에 코드를 변경하거나

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

가 실행 순서는 (1.5 jQuery를에) 다른 함수를

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

function continueExecution(data) { 
    alert(data) 
} 

사용하거나 지연 객체를 호출하는 코드의 실행을 계속 비동기. 현재 다음 단계는 실행됩니다

  1. Ajax 호출
  2. 경고 (MapData); MapData (또는 MapData을 설정하지 않습니다 오차 함수)를 설정 // 알 수없는
  3. 성공 기능

당신은 (제안 같은) 성공 기능에 경고 할 수 있지만 당신은 알고하지 않습니다 변수는 해당 함수에 대해 로컬이거나 실제로 전역입니다. 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/