2012-07-09 3 views
0

$ .ajax()에서 데이터를 다시 가져 오는 간단한 호출을하려고하는데이 함수에서 사용할 수있는 전역 변수에 저장하려고합니다. 아약스 전화를했다.jQuery는 .ajax() 호출 후 데이터를 보존 할 수 없습니다.

변수가 설정되지 않는 이유는 무엇입니까? 왜 제가 설정 한 가치가 없어지나요? 상기 코드에서의 alert()

jQuery.support.cors = true; 

$.myNamespace = { 
    timerID: "in namespace" 
}; 

$(document).ready(function() { 
    $("#btnSkip").click(function() { 
     alert($.myNamespace.timerID); 
     startCall(); 
    }); 

    function startCall() { 
     $.myNamespace.timerID = "in startCall()"; 
     alert($.myNamespace.timerID); 
     finishCall(); 
     alert($.myNamespace.timerID); 
    } 

    function finishCall() { 
     $.myNamespace.timerID = "in finishCall()"; 
     alert($.myNamespace.timerID); 

     $.ajax({ 
      type: "GET", 
      url: getUrl, 
      processData: false, 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (data) { 
       $.myNamespace.timerID = "in ajax succeeded call"; 
       alert($.myNamespace.timerID); 
      }, 
      error: function (xhr, status, error) { 
       GetSongInfoFailed(xhr, status, error); 
      } 
     }); 
    } 

    function GetSongInfoFailed(xhr, status, error) { 
     alert('Service call failed: ' + xhr + ' ' + status + ' ' + error); 
    } 


}); 

출력 :

  1. in namespace
  2. in startCall()
  3. in finishCall()
  4. in ajax succeeded call
  5. in finishCall()

"in ajax succeeded call"대신 "in finishCall()"으로 마지막 변수가 설정되는 이유는 무엇입니까?

참고, 저는 jQuery 또는 javascript 전문가가 아닙니다.

정말 고마워요!

function GetSongInfoSucceeded(C) { 
     if (result != null) { 

      $.myNamespace.timerID = "in ajax succeeded call"; 
      alert($.myNamespace.timerID); 

     } else { } 

    } 

+3

디버깅을 위해 경고 사용을 중지하면 대신 console.log (message)를 사용하십시오. 파이어 폭스에서 파이어 버그를 사용하거나 사파리 또는 크롬에서 개발 도구를 사용할 수 있습니다. 그렇게한다면 훨씬 행복해질 것입니다. –

+0

감사드립니다. 이것은 5 분짜리 프로젝트라고 생각했습니다. 이 때문에 몇 시간이 끝났습니다. – dropsOfJupiter

답변

0

여러분의 성공 콜백 함수는 당신이 데이터 (SECURITY) 기능을 비활성화를받을 때 함수가 입력 데이터 그래서

0

으로 C을수록 잘못된 request 변수가 있습니다. 라고 :

GetSongInfoSucceeded(data); 

우리는 당신의 함수 정의를 보면 : var에 C라는 내부

function GetSongInfoSucceeded(C) { 

다음 우리가 볼, "데이터"의 입력보다 지금이 될 것입니다. 실제로 실행 순서의 질문 -

function GetSongInfoSucceeded(result) { 
    if (result != null) { 
     $.myNamespace.timerID = "in ajax succeeded call"; 
     alert($.myNamespace.timerID); 
    } else { } 
} 
+0

그래, 그게 문제가 아니야. 실제로 나는 성공에 직접 변수를 할당하고 심지어 그것이 작동하지 않습니다. 나는 그것을 "결과"로 변경했다. 아직 아무것도. – dropsOfJupiter

+0

이 제거되고 수정 된 코드입니다. 여전히 같은 문제. 이제는 더 분명히 ... 도와 줘서 고마워. – dropsOfJupiter

0

그것은 데이터를 보존의 문제가 아니다 :

 if (result != null) { 

      $.myNamespace.timerID = "in ajax succeeded call"; 
      alert($.myNamespace.timerID); 

     } else { } 

올바른 방법은이 같은 것이다 : 즉 result를 호출하는 것은 당신에게 어떤 대답을하지 않습니다 이유 . 의 함수의 실제 코드로 finishCall() 호출을 대체, 다시 시간을 당신의 코드를 확인하자

alert($.myNamespace.timerID); 

$.myNamespace.timerID = "in finishCall()"; 
alert($.myNamespace.timerID); 

$.ajax({..., ..., function() {  
    $.myNamespace.timerID = "in ajax succeeded call()"; 
    alert($.myNamespace.timerID); 
}); 

alert($.myNamespace.timerID); 

참조, JS가 마지막 alert를 호출하기 전에 성공 $ 아약스 호출을 기다리지 않습니다. 그리고 그 값은 여전히 ​​in finishCall()입니다.

나는 왜이 alert이 마지막으로 표시되는지, 그리고 마지막으로 표시되지 않는 이유는 무엇입니까? console.log으로 'ajax succeed call'이 실제로 마지막으로 표시됩니다.

+0

네가 맞습니다. 이것이 제가 문제라고 생각하는 것입니다. 이벤트의 순서와 비동기 호출. 그러나, 나는이 기능들이 다른 장소에서 반복적으로 호출되기 때문에 다른 기능과 분리되어 있어야합니다. 나는 당혹 스럽다. – dropsOfJupiter

+0

수정, 동일한 효과. – dropsOfJupiter

관련 문제