2013-02-08 2 views
0

나는이 문제에 대한 해결책을 도처에서 찾았지만 지금까지 아무 것도 찾을 수 없었습니다 (아마도 잘못된 키워드를 사용하고 있습니다!) 이것이 중복되면 지적 해주십시오. 삭제).setTimeout이 완료 될 때까지 콜백 연기하기

당신 중 한 분이 친절하게도 나에게 다음과 같은 이유가 희망적으로 작동하지 않는 이유를 설명해 주시겠습니까? 이 뜻은 콜백이 setTimeoutsuccess 콜백 내에서 완료되기 전에 콜백 되었기 때문에 그 이유를 이해하지 못한다는 것입니다. 새 스레드가 success 콜백 내에서 setTimeout에 의해 시작 되었기 때문에이

$.ajax({ 
    url: options.url, 
    data: options.data, 
    success: function(){ 
     setTimeout(function(){ 
      console.log('firing'); 
     },2000); 
    }, 
    dataType: options.dataType, 
    complete: function(){ 
     console.log('ended'); 
    } 
}); 

인가?

콜백 함수를 success 콜백에 전달하지 않고도이 작업을 수행 할 수 있습니까?

답변

4

setTimeout()이 코드 실행을 차단하지 않기 때문에 발생합니다.

그러므로 complete 콜백은 setTimeout()을 호출하지 않은 것과 같은 순간에 실행됩니다.

당신은 console.log('ended'); 호출을 타임 아웃 (timeout)에 넣거나 완전한 핸들러를 타임 아웃 내에 호출해야 할 것입니다. :)

+0

그것은 빠른 +1이었고 정확히 내가 의심했던 것처럼! :-(콜백 내에 타임 아웃이 없었지만 200ms가 넘는 많은 코드가 있다면'complete' 콜백을 연기하겠습니까? 다른 말로하면,'' setTimeout'? –

+0

시간 초과가 없으면 당연히 잘못 읽었을 것입니다. "완료되었습니다"이벤트가 성공한 후에 만 ​​트리거됩니다. 이벤트의 관점에서 생각하기 시작하면 문제를 쉽게 해결할 수 있다고 생각합니다. ;) 간단하게 정의하고 트리거합니다. –

+0

'complete' 콜백은'success' 콜백이 완료되면 호출됩니다. 어떻게 작동하지 않을까요? –

관련 문제