2010-05-12 9 views
0

콜백을 올바르게 이해하고 자바 스크립트 타이밍 등을 일반적으로 알고 싶습니다.자바 스크립트 및 타이밍 (특히 콜백 포함)

내 코드가 이렇게 생겼다고 가정하면 순서대로 실행됩니다.

SetList(); // initializes the var _list 

Some.Code(_list, function(data) { 

     // update list 

}); 

DoSomething(_list); // operates on _list 

업데이트

내가보고하고하는 것은 다음 다음 연주곡 전화, 해봐요, Some.Code입니다.

일부 코드는 다른 기능을 호출합니다. 그래서 :

Some.Code(_list, function() { 

    //load _list from ajax request 
    Other.Code.WithCallback(_list, function(){....}); 

}); 

나는 다른 콜백과 내부 기능에 해봐요을 추가해야합니다,이 문제를 해결하는 것 같아요?

답변

1

SetList(), Some.Code()DoSomething()과 그 순서 하나씩으로 실행된다. Some.Code()의 두 번째 인수로 전달 된 익명 함수는 Some.Code() (함수가 반환되고 DoSomething()이 호출되기 전에) 호출 중에 호출되거나 다른 함수 및 이벤트 처리기 또는 타이머에 의해 나중에 호출 될 수 있습니다. 당신이 부름을 명할 때.


은 당신이 아약스를 사용하고 있기 때문에, 원격 서버에 대한 요청은 별도의 스레드에서 만든, 그래서 자바 스크립트 스레드를 실행하면에 대한 실행보다 구체적으로 (또는, 응답 할 때까지 다른 함수를 호출 계속 onreadystatechange 이벤트 발생). ajax 요청의 준비 상태가 변경되면 해당 readystatechange 이벤트 핸들러가 대기하도록 대기합니다. 즉, 현재 실행중인 모든 스크립트가 끝나 자마자 실행됩니다.

응답을 ajax를 통해받은 후에 DoSomething()을 실행하려면 콜백 함수의 끝까지 실행해야합니다. 순서대로 실행할 것이다

+0

DoSomething (_list) 호출 전에 익명 함수가 실행되도록하려면 어떻게해야합니까? ? – Blankman

+0

@Blankman :'Some.Code()'메소드가 실행되는 동안 어떤 시점에서 호출해야합니다. –

+0

내 질문 업데이트 .. – Blankman

-1

그 코드 :

연주곡() 다음 Some.Code(), 그 다음 기능 (데이터)를, 다음 해봐요().

JavaScript는 단일 스레드이며 순서대로 실행됩니다. 당신이 Some.Code() 내에 interval/timer를 설정하거나 다른 함수를 호출 한 function (data)을 설정하면 상황이 동기화되지 않는 유일한 방법입니다.

당신이 있다면 :

"주문에서"을 경고하지만 것
var i=0; 
functionCall() //some long process that sets i=1; 
if (i==1) { alert("In Order!"); } else { alert("Out of Order!"); } 

당신이 있다면 : 을 실행할 것

var i=0; 
setTimeout(functionCall, 1000) //some long process that sets i=1; 
if (i==1) { alert("In Order!"); } else { alert("Out of Order!"); } 

"주문 중" 때문에 functionCall()이 호출되기 전에 세 번째 줄이 실행됩니다.

업데이트 대답은 Ajax를 사용하고 있기 때문에, 당신이 지연의 이유는 비동기 호출을하고 있습니다 같은데요

.콜백 함수가 있지만 여전히 호출 대기 중이므로 Javascript는 기다리는 동안 다음 줄을 실행하도록 이동합니다.

는이 작업을 수행해야합니다, 당신이 원하는 순서대로 실행하려면

SetList(); // initilizes the var _list 
Some.Code(_list, function(data) { 
    // update list 
    DoSomething(_list); // operates on _list 
}); 

이 방법, 당신은 당신의 콜백 메서드를 호출 할 때 해봐요()가 호출되도록 할 수 있습니다, 그리고 전.

+0

함수 (데이터) 않습니다 * 당신이 말한 순서대로 실행 얻을. 그것은 Some.Code에 대한 인수로 전달되며 언제든지 실행될 수도 있고 전혀 실행되지 않을 수도 있습니다. 말할 충분한 정보가 없습니다. – Nathan

+0

기능 (데이터)이 호출되는지 여부는 실제로 지점 외입니다. function (data)의 구조에서 알 수 있듯이 DoSomething (_list)에 대한 호출을 추가하면 콜백 메소드의 일부가됩니다. 즉, 모든 순서가 끝난 후에 트리거되어 원하는 순서를 유지합니다. – AlishahNovin

관련 문제