7

Tôi không thể hiểu tại sao nguyên mẫu triệt tiêu các thông báo lỗi trong sự kiện dom:loaded và trong trình xử lý AJAX.Nguyên mẫu JS nuốt lỗi trong dom: nạp, và gọi lại ajax?

Với mảnh sau của HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>Conforming XHTML 1.1 Template</title> 
     <script type="text/javascript" src="prototype.js"></script> 
     <script type="text/javascript"> 
      document.observe('dom:loaded', function() { 
       console.log('domready'); 
       console.log(idontexist); 
      }); 
     </script> 
    </head> 
    <body> 
    </body> 
</html> 

Ngọn lửa sự kiện domready, tôi thấy các bản ghi trong giao diện điều khiển, nhưng không có dấu hiệu của bất kỳ lỗi nào. Nếu bạn di chuyển dòng console.log(idontexist); ra khỏi xử lý, bạn sẽ có được

idontexist không được định nghĩa

lỗi trong giao diện điều khiển. Tôi thấy nó hơi lạ, trong các trình xử lý sự kiện khác, như 'click', bạn nhận được thông báo lỗi, có vẻ như chỉ có dom:loaded có vấn đề này.

Cũng vậy với bộ xử lý AJAX:

new Ajax.Request('/', { 
    method: 'get', 
    onComplete: function(r) { 
     console.log('xhr complete'); 
     alert(youwontseeme); 
    } 
}); 

Bạn sẽ không thấy bất kỳ lỗi nào. Điều này là với prototype.js 1.6.1 và tôi không thể tìm thấy bất kỳ dấu hiệu nào về hành vi này trong tài liệu, cũng không phải là cách để kích hoạt báo cáo lỗi trong các trình xử lý này.

Tôi đã cố gắng bước qua đoạn code với debugger Firebug, và có vẻ như để chuyển đến một chức năng trên đường dây 53 tên K, khi nó gặp biến mất trong xử lý dom:loaded:

K: function(x) { return x } 

Nhưng làm thế nào? Tại sao? Khi nào? Tôi không thể thấy bất kỳ khối try/catch ở đó, luồng chương trình kết thúc ở đó như thế nào?

Tôi biết rằng tôi có thể hiển thị lỗi bằng cách đóng bộ xử lý dom:ready của tôi trong các khối thử/nắm bắt, nhưng đó không phải là một lựa chọn rất thoải mái. Cũng giống như vậy khi đăng ký một trình xử lý onException toàn cầu cho các cuộc gọi AJAX.

Tại sao nó thậm chí ngăn chặn các lỗi? Đã có ai đó gặp phải điều này trước đây chưa?

Trả lời

5

sau một thời gian tôi tìm thấy nguyên mẫu mà chuyển hướng tất cả các trường hợp ngoại lệ để xử lý onException:

new Ajax.Request('/ajax_html_echo', { 
    method: 'get', 
    onComplete: function(r) { 
     console.log('xhr complete'); 
     alert(undefinedVar) 
    }, 
    onException: function(request,e){ 
     console.log(e.message); // prints undefinedVar is not defined 
    } 
}); 

biết thêm đây

http://www.prototypejs.org/api/ajax/options

onException kích hoạt mỗi khi một lỗi XHR phát sinh. Có chữ ký tùy chỉnh: đối số đầu tiên là người yêu cầu (ví dụ: một ví dụ Ajax.Request), giây là đối tượng ngoại lệ.

+2

Trong khi vâng, đây là một giải pháp một phần, tôi nói rằng tôi muốn thấy một giải pháp mà không đăng ký một handler onException toàn cầu cho gọi AJAX, và điều này cũng đi cho per- yêu cầu xử lý. –

2

Bạn cũng có thể tái ném ngoại lệ từ onException và bạn sẽ nhận được nó trong cùng một cách như thể nó đã xảy ra bên ngoài gọi

onException: function(request,e){throw e;} 
0

Làm việc đối với tôi

Ajax.Responders

Kho lưu trữ người nghe toàn cầu được thông báo về mọi bước của các yêu cầu Ajax dựa trên Prototype.

http://api.prototypejs.org/ajax/Ajax/Responders/

Ajax.Responders.register({ 
    onCreate: function() { 
    Ajax.activeRequestCount++; 
    }, 
    onComplete: function() { 
    Ajax.activeRequestCount--; 
    } 
}); 
Các vấn đề liên quan