2009-08-04 4 views
39

나는 나의 AJAX 개발을 수행하는 프로토 타입을 사용하고, 나는이 같은 코드를 사용합니다AJAX 응답을 반환하는 방법 텍스트?

somefunction: function(){ 
    var result = ""; 
    myAjax = new Ajax.Request(postUrl, { 
     method: 'post', 
     postBody: postData, 
     contentType: 'application/x-www-form-urlencoded', 
     onComplete: function(transport){ 
      if (200 == transport.status) { 
       result = transport.responseText; 
      } 
     } 
    }); 
    return result; 
} 

을 그리고는 "결과가"빈 문자열는 사실을 알게 될 것입니다. 그래서 나는 이것을 시도했다 :

somefunction: function(){ 
    var result = ""; 
    myAjax = new Ajax.Request(postUrl, { 
     method: 'post', 
     postBody: postData, 
     contentType: 'application/x-www-form-urlencoded', 
     onComplete: function(transport){ 
      if (200 == transport.status) { 
       result = transport.responseText; 
       return result; 
      } 
     } 
    }); 

} 

그러나 그것은 또한 효과가 없었다. 다른 메소드가 사용할 responseText를 어떻게 얻을 수 있습니까?

답변

27

someFunction이 완료된 후에도 onComplete가 오래 호출된다는 것을 기억하십시오. 콜백 함수를 somefunction에 매개 변수로 전달해야합니다. 프로세스가 (즉, onComplete를)를 작업 할 때이 함수가 호출됩니다

somefunction: function(callback){ 
    var result = ""; 
    myAjax = new Ajax.Request(postUrl, { 
     method: 'post', 
     postBody: postData, 
     contentType: 'application/x-www-form-urlencoded', 
     onComplete: function(transport){ 
      if (200 == transport.status) { 
       result = transport.responseText; 
       callback(result); 
      } 
     } 
    }); 

} 
somefunction(function(result){ 
    alert(result); 
}); 
+0

당신의 대답은 훌륭하고 기능적/oop 스타일이며, 정말 훌륭합니다. 그러나 [누군가] 대답은 요점이었습니다. 비동기 : false는보다 쉽고 질문 작성자가 원했던 것이 더 쉽습니다 (그러나 솔루션은보다 확장 가능하고 유연합니다). –

+1

asynchronous : false는 응답을받을 때까지 브라우저를 중지합니다. 네트워크 연결이 느려서 서버에 연결하는 데 몇 초가 걸리면 브라우저 전체가 몇 초 동안 멈추고 사용자 입력에 응답하지 않습니다. 이것은 좋은 유용성이 아닙니다. 더 쉬울 수도 있지만 잘 동작하지 않으므로 ** 비동기 : false가 사용되지 않아야합니다 **. – Marius

+0

죄송합니다. 전에 실제로 비동기를 사용하지 않았습니다. 당신은 맞습니다. 그래서 기본적으로'function ajaxLoader() {var fAjaxLoaded = false; $. ajax (..., success : function() {fAjaxLoaded = true;})와 동일합니다. while (fAjaxLoaded); return ...}' –

3

방법 "비동기 : 거짓"을 추가하는 방법에 대한 코드에서? 제 경우에는 잘 작동했습니다 :)

+0

그게 아약스의 목적을 꺾었습니까? –

+5

동기 요청을 사용하면 요청이 반환 될 때까지 브라우저에서 모든 JS 실행을 차단하기 때문에 좋지 않습니다. – finishingmove

+1

목적을 저지하지만 하루를 절약합니다. –

관련 문제