2011-02-22 7 views

답변

3

아약스 호출 비동기 같습니다

function grabNodes(env, poolName){ 
    var env = "dev"; 
    var nodeArray = new Array(); 

    var ajaxRequest; //initialize ajax object 

    var browser = navigator.appName; //find the browser name 
    if(browser == "Microsoft Internet Explorer"){ 
     /* Create the object using MSIE's method */ 
     ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    else{ 
     /* Create the object using other browser's method */ 
     ajaxRequest = new XMLHttpRequest(); 
    } 

    // Create a function that will receive data sent from the server 
    ajaxRequest.onreadystatechange = function(){ 
     if(ajaxRequest.readyState == 4){ 
     // Get the data from the server's response 
     //what on this page is changing 
      var xmlRes=ajaxRequest.responseXML.documentElement; 
      try { 
       for(var i=0; i<xmlRes.getElementsByTagName('node').length;i++){ 
        nodeArray[i] = xmlRes.getElementsByTagName('node')[i].firstChild.nodeValue; 
       }//end for loop 
      } 
      catch (err){ 
      } 
      alert(nodeArray[0]); 
     } 

    } 

//return nodeArray; 
} 

함수를 호출합니다. alert(nodeArray[0]);보다 먼저 실행되고은 사용자가 ajaxRequest.onreadystatechange에 지정한 기능입니다.

콜백에 alert을 넣으면 제대로 작동합니다 (유효한 응답이 있으면). 결과에 대해 작동해야하는 모든 코드를 콜백에서 호출해야합니다.

업데이트 : 데이터를 반환 할 수 없습니다. 콜백을 사용하도록 코드를 재구성해야합니다.

당신이 그것을 변경해야

oNodeArray = grabNodes(env, poolName); 

// work on `oNodearray` 

처럼 현재 코드 인 경우 :

grabNodes(env, poolName, function(oNodearray) { 
    // work on `oNodearray` 
}); 

와 아약스 콜백 당신이 전달하는 함수를 호출하고 여기에 배열을 전달할 수 있습니다

function grabNodes(env, poolName, callback){ 
    //.... 
    ajaxRequest.onreadystatechange = function(){ 
     // stuff 
     callback(nodeArray); 
    } 
} 

Ajax 호출은 비동기이기 때문에 코드 실행을 차단하지 않습니다. 일단 데이터가 수신되면 실행될 함수를 전달해야합니다.


또한 의견 :

  • 사용 var nodeArray = []; 배열을 초기화합니다.
  • var env = "dev";env의 그림자입니다. 당신이 디폴트 값을 지정하려면,

    env = env || 'dev'; 
    
+0

그래서 나는 경고를 옮겼다. 그리고 나는 그것이 작동하고 있다는 것을 알기 위해 나에게 데이터를 준다. 그러나 나는 그 진술서를 이해하지 못하고있다. grabNodes()를 호출하는 다른 함수에있는 oNodeArray로 돌아 가야합니다. – Jim

+0

@Jim : 콜백에 return 문을 넣을 필요가 없습니다. 아무런 효과가 없습니다. 내 업데이트 된 답변을 참조하십시오. –

+0

grabNodes()가 이미 ajax 콜백에서 배열을 설정할 때까지 반환되었습니다. ajax 콜백에서 nodeArray 매개 변수로 주어진 함수를 호출 할 수 있도록 코드를 다시 형식화해야합니다. 당신은 동기식 방식으로 이것을 프로그램하려고하지만 Ajax는 정의상 동기식이 아닙니다. –

0

AJAX 호출이 경고가 호출 될 때 아직 완료 가장 가능성이 없습니다 않습니다. 이것은 onreadystatechange 핸들러 안에 위치해야합니다.