2013-05-15 2 views
4

여기 테스트 사이트가 있습니다 (kdmalikdesign.com/test/rsd/index.html). 나는 그것으로 여러 가지 일을하는 중간에있다. 내 주요 관심사는 지금 ASYNC가 거짓말을하지 않으면 나쁜 결과를 낳지 않는다는 것입니다.AJAX ASYNC 거짓 대 사실

이제는 async가 false 인 이유를 확인했습니다. 성공 콜백을 실행하면 XML 데이터가로드되지 않지만 완료 콜백을로드 할 때 모든 것이 잘로드되기 때문입니다. 성공 콜백으로 제대로 작동하려면 비동기 false로 변경해야했습니다.

이렇게하는 구체적인 방법이 있습니까? 기본적으로 ajax 호출이 수행하는 작업은 xml 파일을 잡고 특정 데이터가있는 페이지를 채우는 파일 이름에 따라 읽는 것입니다. 기본적으로 연습/훈련으로하고 있습니다. 비 동시성에 대한 모든 혜택을 잃고있는 동안 당신이에서 같은 일을하는 콜백을 사용할 수있을 때 당신이 효과적으로 요청을 실행으로

는 동기 호출을 실행하면 일반적으로 과실이다 Kamron

+2

[이 질문] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) 도움이 될 수 있습니다. 귀하의 질문은 지금과 같이 상세한 내용이나 코드가 없으므로 답할 수 없습니다. – Blazemonger

+0

ASYNC FALSE는 다음 단계로 진행하기 전에 브라우저가 AJAX가 완료 될 때까지 기다릴 수 있기 때문에 나쁜 것으로 간주됩니다. 그것이 당신의 어플리케이션에 이해된다면 문제가되지 않을 것입니다. – Sablefoste

+0

'async : true'로 할 수있는 일을하는 것처럼 들리 겠지만, 로직을 제대로 처리하지 못하는 것 같습니다. 예를 들어 성공 콜백은 데이터를 반환하지 않아야하며 성공 콜백에서 직접 정의되지 않은 변수는 업데이트하지 않아야합니다. –

답변

5

에게 감사 비동기 패션.

async:false이 반환 될 때까지 jQuery.ajax() 호출을 차단합니다. 효과적으로, 대신의 의사에 :

function ajax: 
    perform request 
    callback with results 

당신은이 일을하고 있습니다 :

function ajax: 
    perform request 
    while (no results) wait 
    return results 

다른 작업이 완전히 차단 실행이 꽤 끔찍한이다 ... 끝날 때까지. 명백한 유스 케이스는 waterfall 패턴 (task 1 -> task 2 -> task 3)을 실행하는 것입니다.

브라우저를 차단할 수 있다면 콜백 사용을 고려해보십시오. 그들은 당신이 처리하는 동안 귀하의 사이트의 나머지 부분을 적극적으로 잘 유지하도록 허락 할 것입니다. async:true을 설정하고 다음 단계에서 콜백을 제공하면 쉽게이 작업을 수행 할 수 있습니다. 그러나 콜백 스파게티로 끝날 수도 있고, 대규모 작업을 관리 할 라이브러리를 원할 수도 있습니다.

Node.JS의 가장 좋은 후보는 async.js입니다. MapReduce에 대한 도구는 이고 실행 모델은 및 parallel입니다.

이야기의 사기 : async : false 시간의 100 %를 콜백으로 바꿀 수 있습니다.

+0

필요한 경우가 있습니다. 'beforeClose' 콜백을 사용하여 제 질문을보십시오. 그것은 할 수 없습니다. http://stackoverflow.com/questions/16153314/success-function-not-occurring-before-ajax-complete. – Sablefoste

+1

@SableFoste : "async"가 여전히 참일 수있는 질문에 대한 답변도 있다고 생각합니다. 시간의 99 %는 불필요합니다. –

+0

@SableFoste :'$ .when ($. ajax ({blah})). (function() {blah;});'. 이런 식으로 두 콜백을 정의하면 둘 다 서로의 범위 내에있게되어 그 사이에 myresult를 전달할 수는 있지만 반환 할 수는 없습니다. 경우 폐쇄. –

1

비동기 호출을 구현하려면 결과 데이터로 수행 할 모든 논리를 .succcess() 콜백에 구성해야합니다.

이유는 async가 false 일 때 성공 콜백을 실행하면 XML 데이터가로드되지 않지만 완료 콜백을로드 할 때 모든 것이 잘로드되기 때문입니다.

정의에 의해 요청이 완료되고 반환 된 데이터를 사용할 수있게되면 success callback이 실행되기 때문에 질문의 해당 줄이 다소 혼란 스럽습니다.,이 경우

function ajaxrequest() { 
    var someValue; 
    $.get('serverFile.php', function(data){ 
     someValue = data; 
    }); 
    return someValue; 
} 

제공 한 콜백이 기적 실행되지 않기 때문에이 반환 될 때, 변수 someValue이 비어있을 것입니다 :

이것은 당신이 async: true로 할 수없는 것을의 예입니다 또는 코드의 나머지 부분과 함께 인라인 할 수 있습니다. 그들이 jQuery Deferred 개체를 반환 I가이 방법을 부러

function getData() { 
    return $.get('serverFile.php'); 
} 
function alertData() { 
    getData().done(function(data){ 
     alert(data); 
    }); 
} 
function logData() { 
    getData().done(function(data){ 
     console.log(data); 
    }); 
} 

을 당신이 당신의 요구 방법을 분리하는 것이 도움이 될 수 있음을 볼 수 있도록하고 있습니다

이 같은 코드를 구성 할 수 있습니다 async:true을 사용하려면 필요한 경우 여러 다른 기능이 동일한 요청을 활용할 수 있습니다. 동일한 요청 위치와 진정한

0

비동기는,이 요청이 더 이상 응답 n 번째 요청에

반복하고 두 번째 특별한 경우 너무 많은 연결 문제가 발생합니다 특별히 데이터베이스 쿼리, 데이터가 범람하는 것이 중요합니다