Sau một hành vi kỳ lạ của ứng dụng của chúng tôi (sử dụng Strophe XMPP và jquery), chúng tôi đã phát hiện ra rằng vòng lặp sự kiện jquery là đồng bộ và không bắt ngoại lệ.Tại sao vòng lặp sự kiện Jquery bị gián đoạn trên ngoại lệ
Điều đó có nghĩa là nếu trình xử lý sự kiện đầu tiên tăng ngoại lệ, điều thứ hai sẽ không bao giờ được gọi.
$(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
}
Chúng tôi dự kiến sẽ thấy hai kết quả đầu ra, nhưng thứ hai: "listener onBar" không bao giờ được hiển thị.
Xem mã JQuery, trong chức năng "kích hoạt", không có mẫu thử/bắt trong vòng lặp của trình xử lý.
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)
Chúng tôi đã rất ngạc nhiên bởi việc triển khai này.
Trong javascript thuần túy, tất cả trình xử lý được gọi ngay cả khi một trong số chúng bị lỗi: http://jsfiddle.net/bamthomas/kgS7A/2/.
Có ai biết tại sao nhóm JQuery không cho phép thực hiện trình xử lý tiếp theo ngay cả khi trình xử lý tiếp theo bị lỗi? Tại sao ngoại lệ không bị bắt?
Tại sao họ không sử dụng trình xử lý sự kiện javascript?
"Tại sao jQuery không nắm bắt ngoại lệ?" - rất có thể là vì không ai nghĩ rằng đây có thể là một vấn đề. Bạn có thể gửi yêu cầu kéo đến repo github của họ. –
Nếu trình xử lý sự kiện của bạn có thể ném, thì bạn có trách nhiệm bắt ngoại lệ. Tại sao bạn mong đợi (hoặc thậm chí muốn) rằng 'trigger' làm điều đó? – Tomalak
Giống như khám phá mà jQuery không nắm bắt ngoại lệ có thể hữu ích, tôi không nghĩ câu hỏi này có thể được trả lời một cách khách quan ... –