strophe XMPP 및 jquery를 사용하여 애플리케이션의 이상한 동작이 발생한 후 jquery 이벤트 루프가 동기적이고 예외를 포착하지 않는다는 것을 알게되었습니다.예외가 발생했을 때 Jquery 이벤트 루프가 중단되는 이유
첫 번째 이벤트 처리기에서 예외가 발생하면 두 번째 이벤트 처리기가 호출되지 않습니다.
$(document).ready(function() {
$(document).bind('foo', onFoo);
$(document).bind('bar', onBar);
$(document).trigger('foo');
$(document).trigger('bar');
});
function onFoo(e) {
console.log('listener onFoo');
throw 'fail onFoo';
}
function onBar(e) {
console.log('listener onBar'); // not called
}
두 개의 출력이 표시 될 것으로 예상되지만 두 번째 출력 : "listener onBar"는 표시되지 않습니다.
"트리거"함수에서 JQuery 코드를 참조하십시오. 처리기의 루프 중에 try/catch 패턴이 없습니다.
while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {
event.type = i > 1 ?
bubbleType :
special.bindType || type;
// jQuery handler
handle = (jQuery._data(cur, "events") || {})[ event.type ] && jQuery._data(cur, "handle");
if (handle) {
handle.apply(cur, data);
}
... (line 4998 in JQuery 1.10.2)
우리는이 구현에 놀랐다.
순수 자바 스크립트에서는 모든 핸들러가 충돌하더라도 하나의 핸들러가 호출됩니다 (http://jsfiddle.net/bamthomas/kgS7A/2/).
누군가 JQuery 팀이 이전 처리기가 다운 된 경우에도 다음 처리기의 실행을 허용하지 않는 이유를 알고 있습니까? 예외가 붙잡히지 않는 이유는 무엇입니까?
왜 자바 스크립트 이벤트 처리기를 사용하지 않았습니까?
"왜 jQuery가 예외를 catch하지 않습니까?" - 아무도 이것이 문제 일 수 있다고 생각하지 않기 때문일 가능성이 큽니다. 그들의 github repo에 끌어 오기 요청을 보내실 수 있습니다. –
이벤트 처리기에서 throw 할 수있는 경우 예외를 잡는 것은 사용자의 책임입니다. 왜 '방아쇠'가 그렇게 할 것으로 기대합니까? – Tomalak
jQuery가 예외를 잡아 내지 못한다는 발견만큼 유용 할 수 있습니다. 나는이 질문이 객관적으로 대답 될 수 있다고 생각하지 않습니다 ... –