2014-07-06 2 views
2

$.ajax({url:"xxx"}).responseTextundefined으로 반환됩니까? 그러나 a=$.ajax({url:"xxx"}), a.responseText을 사용하면 올바른 결과를 반환합니다.

감사합니다.

+0

는 즉시 할당 후'a.responseText'를 사용하고 있습니까? – nnnnnn

+3

나는 이것을 테스트해야했고, 아약스는 ** 비동기식 **이므로, 항상'undefined'를 리턴하고, 호출이 완료되면 responseText가 리턴된다. – adeneo

+0

대단히 감사합니다! 가지고 있습니다! 이유는 기본 비동기가 true입니다. – tianzhi0549

답변

3

이것은 경쟁 조건 (일종의)입니다.

AJAX는 비동기식이므로 백그라운드에서 실행됩니다. 수행 할 때 :

$.ajax({url:"xxx"}).responseText 

너무 빠르게 responseText을 가져 오는 중입니다. 이 값을 값으로 전달하면 Ajax가 호출을 완료하고 responseText에 값이 있습니다.

콘솔에 AJAX 요청을 기록하는 AJAX debugger과 같은 것을 설치하면 실제로 나타날 수 있습니다. 그러면 undefined 응답이 이되고은 ajax 호출을 완료한다는 것을 알 수 있습니다. 또한 async: false을 설정하여 동기 호출이 작동하는지 확인할 수 있습니다 (하지만 그렇게하지는 말고 AJAX 포인트를 무시합니다).

심지어 두 번째 예제도 (때로는) 정의되지 않은 값을 반환 할 수 있습니다. 큰 사이트는 응답을 반환하는 데 더 오래 걸리므로 실제로 의존 할 수는 없습니다. 이 필요한 아약스 complete event 내부 로직을 실행하는 것입니다 수행하는 올바른 방법 (더 나은 또는 - success 이벤트)

+0

또한 AJAX 호출에 대해'async'를'false'로 설정하면 제대로 작동하는지 확인해야합니다. – Jimbo

+0

@ Jimbo 당신 말이 맞아요.하지만 그렇게하지 않는 것이 좋습니다. 그것은 다소 요점을 무시합니다. 대신, ajax 호출의 "complete 이벤트"(http://api.jquery.com/Ajax_Events/) 내에서 필요한 로직을 실행하는 것이 더 낫습니다 (또는 더 나은, 성공 이벤트) – yuvi

+1

아니오 ,'async' 값을'false'로 설정하면 ** 당신의 포인트를 증명할 것이고, 다시 스위치 될 수 있습니다. – Jimbo

0

통화가 비동기입니다. 응답을 사용하려면 성공에 할당 된 함수를 사용해야합니다. 내용을 명확히하기 위해 docs을 읽으십시오.

관련 문제