2012-12-24 3 views
16

트리거 함수는 동기식으로 표시됩니다. 즉, 모든 바운드 함수는 동 기적으로 순서대로 실행되는 것처럼 보입니다 (호출 된 함수는 비동기 적으로 처리 할 수 ​​있지만 문제는 아닙니다).jQuery 트리거 함수가 동기가 보장되는지

이 사용자와 비 사용자 (마우스를 클릭 등) 이벤트에 대한 사실인가요? 자바 스크립트의 단일 스레드 보장이 적용되지 않는 이벤트가 있습니까?

가 참이면

이 동작은 각각의 결합 된 기능에 시간 제한을 삽입하지 않고 비동기들을 실행하도록 변경 될 수 있는가?

var ele = $('#blah'); 
// Example of the bound function doing something synchronously 
ele.bind('customEvent.sync', function() { 
    // Do something synchronously 
    window.foo = 'foo'; 
}); 

// Example of the bound function doing something asynchronously 
ele.bind('customEvent.async', function() { 
    window.setTimeout(function() { 
     // Do something asynchronously 
     window.bar = 'bar'; 
    }, 0); 
}); 

// Trigger both events 
ele.trigger('customEvent'); 

// If trigger is guaranteed to be synchronous this should alert 'foo:undefined' or possibly 'foo:bar' depending on whether the asych function was called first 
// If trigger is NOT synchronous 'undefined:undefined', 'foo:undefined', 'undefined:bar', or 'foo:bar' could be alerted 
alert(window.foo + ':' + window.bar); 

UPDATE 참조 : 여기

는 문제를 보여주는 샘플입니다 Is JavaScript guaranteed to be single-threaded? 사용자 정의 이벤트가 있기 때문에 자바 스크립트의 단일 스레드 성격의 동기로 보장됩니다. 일부 이벤트 유형은 브라우저 불일치로 인해 동기화되지 않을 수 있습니다.

+0

만약 당신이 당신의 관심사가 무엇인지 예를 들면 훨씬 더 쉽게 – charlietfl

+0

내 관심사는 내 방아쇠를 호출 한 다음에 실행되기 전에 내 방아쇠라고 불리는 바운드 함수에 의존 할 수 있는지의 여부입니다 – Kyle

+0

질문이있는 것 같습니다. 충돌하는 : "호출 된 함수가 비동기식 작업을 수행 할 수 있지만 질문이 아닙니다."그리고 "각각의 바인딩 된 함수에 시간 초과를 삽입하지 않고 비동기 실행으로 동작이 변경 될 수 있습니까?"(나는 아니지만 * 질문이었습니다) –

답변

16

자신 이상 제공 코멘트 약간 수정 된 선집 - 근대의 뿌리 - 근대의 뿌리 :

  • 이벤트에는 시간이 없다; 핸들러가 제공되면 스레드가 시작됩니다. 따라서 이벤트 자체가 동기 또는 비동기가 될 수 없습니다. 이벤트가 자극하는 스레드는 항상 동기식이지만 하나 이상의 비동기식 프로세스를 시작할 수 있습니다.

  • .trigger()에 대한 호출은 트리거 된 이벤트 핸들러에서 시작될 수있는 비동기 프로세스에 관계없이 항상 동기입니다. 트리거 된 핸들러가 반환되면 실행은 .trigger (...) 다음의 명령문으로 되돌아갑니다. 즉, .trigger()는 영광스러운 함수 호출입니다.

  • 자바 스크립트에서 timeout duration이 0 인 경우에도 setTimeout()이 시작될 때까지 현재 스레드가 완료되기까지 절대적으로 보장됩니다. ajax와 동일 - 예 : $.ajax(...)이 호출됩니다. 서 v가 즉시 응답 할지라도 성공/오류/완료 핸들러가 시작되기 전에 완료까지 실행되도록 보장됩니다.

  • 단일 쓰레드 특성, 즉 ECMA-262 (자바 스크립트), 고유이다. 언제든지 최대 하나의 스레드가 실행 중일 수 있습니다.

추가 점 : Is javascript guaranteed to be single-threaded?에 acceped 대답이 잘못된 전제를 기반으로

. javascript가 단일 스레드가 아니라는 증거는 없습니다. @KrisGiesing의 코멘트는 오해를 일 깨웠다.

관련 문제