Po dziwnym zachowaniu naszej aplikacji (przy użyciu strophe XMPP i jquery) odkryliśmy, że pętla zdarzeń jquery jest synchroniczna i nie przechwytuje wyjątku.Dlaczego pętla zdarzeń Jquery jest przerywana na wyjątku
Oznacza to, że jeśli pierwsza procedura obsługi zdarzenia zgłosi wyjątek, druga nie zostanie wywołana.
$(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
}
Oczekiwaliśmy dwóch wyjść, ale drugi: "listener onBar" nigdy nie był wyświetlany.
Zobacz kod JQuery, w funkcji "trigger", nie ma wzorca try/catch podczas pętli procedur obsługi.
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)
Byliśmy zaskoczeni tą realizacją.
W czystym javascriptu wszystkie procedury obsługi są wywoływane, nawet jeśli jeden z nich się zawiesił: http://jsfiddle.net/bamthomas/kgS7A/2/.
Czy ktoś wie, dlaczego zespół JQuery nie pozwala na wykonanie następnego programu obsługi, nawet jeśli poprzedni się zawiesił? Dlaczego wyjątki nie są chwytane?
Dlaczego nie użyli obsługi zdarzeń javascript?
"Dlaczego jQuery nie przechwytuje wyjątków?" - najprawdopodobniej dlatego, że nikt nie myślał, że to może być problem. Zapraszamy do wysłania prośby o wycofanie do repozytorium github. –
Jeśli Twój przewodnik zdarzeń może rzucić, to Twoim obowiązkiem jest złapać wyjątek. Dlaczego miałbyś oczekiwać (lub nawet chcesz), że "trigger" to robi? – Tomalak
Chociaż odkrycie, że jQuery nie przechwytuje wyjątków, może być użyteczne, nie sądzę, aby to pytanie można było obiektywnie odpowiedzieć ... –