2009-03-06 3 views
0

내 XHR의 onreadystatechange 함수를 사용하면 쉽게 document.title = xhr.responseText을 수행 할 수 있습니다. 그러나이 함수가 responseText를 반환하도록 만들면 내 XHR의 외래 래퍼와 동일한 변수를 설정하여 응답과 동일하게 설정할 수 없습니다. 이 일을하는 방법이 있습니까? 내 래퍼 변수를 XMLHttpRequest의 responseText 값과 같게 설정할 수없는 이유는 무엇입니까?

: 이제

ajax = function(url, cb) 
{ 
    xhr = (window.XMLHttpRequest) 
     ? new XMLHttpRequest() 
     : new ActiveXObject('Microsoft.XMLHTTP'); 
    xhr.onreadystatechange = function() 
    { 
     if (xhr.readyState == 4 && xhr.status == 200) 
     { 
      cb(xhr.responseText); 
     }; 
    } 
    xhr.open('get', url, true); 
    xhr.send(); 
}; 

내가 같은 한 경우 :

ajax('bacon.txt', function(_) 
{ 
    document.title = _; 
} 

그것을 절대적으로 완벽하게 작동합니다; document.title은 사실 bacon.txt 호출의 responseText가됩니다. 그러나 다음과 같이이 방법을 구현하려고하면 :

document.title = ajax('bacon.txt', function(_) 
{ 
    return _; 
} 

그런 행운이 없습니다. 왜 이것이 사람인지 명확히 할 수 있습니까? };

+0

래퍼 코드가 더 잘 이해할 수 있습니다. – shahkalpesh

+0

아마도 함수의 범위를 벗어난 변수를 선언하지 않았을 것입니다. –

답변

7

제목에 ajax 함수를 반환합니다. ajax 함수 자체는 아무 것도 반환하지 않습니다.

AJAX의 요점은 서버에 즉시 응답을 보내면 전에이 응답을 받았다는 것입니다. title 속성에 undefined를 지정합니다 (BTW, 보통 ajax 함수를 사용하여 xhr을 반환하므로 필요한 경우 중단 할 수 있음).

요청이 완료되면 콜백 (코드에서 cb) 함수가 호출되므로 원래 코드가 의미가 있으며 할당이 수행됩니다.

+0

+1 : "return '보낸 요청을 추가하면;" xhr.send(); 너는 깨달을지도 모른다. – Greg

0

onreadystatechange 함수의 결과가 "ajax"함수와 같지 않습니다 ... 게시물 동기화를 수행하고 ajax 함수를 동일하게 되돌릴 수는 있지만 결국 사용자 응답이 지연됩니다. 응답 시간이 너무 오래 걸리면 브라우저가 표시됩니다.

더 나은 방법은 원하는대로 다른 방법을 찾는 것입니다. 내 말은, 그것이 더 나빠질 것이기 때문에 그렇게 작동 시키려하지 마라.

관련 문제