为什么将ProgressEvent对象传递给JavaScript AJAX错误事件处理程序?

时间:2018-07-20 23:26:53

标签: javascript ajax

这真的使我感到困惑。

我有侦听AJAX事件的代码,所有这些事件均按计划运行,但是有一个怪异之处使我震惊。即,如果我将错误事件侦听器附加到AJAX XMLHttpRequest对象,并且在该对象上触发了错误事件,则错误事件处理程序将接收一个ProgressEvent对象,该对象不包含任何有用的错误信息。

我的直觉告诉我,应该向错误事件处理程序发送的 是一个ErrorEvent对象。但这不会发生。

鉴于这个奇怪的怪癖,当发生实际 AJAX错误时,我该如何检测?我也很想问,永远不会提供错误信息的错误事件处理程序的意义是什么?

如果有某种理由将ProgressEvent对象传递给AJAX错误事件处理程序,那么我也真的很希望这一解释。

1 个答案:

答案 0 :(得分:1)

脚本或文件中发生错误时,将发送ErrorEvent

例如,如果在工作脚本中发生未处理的错误,则会发送该消息:

var throwing_script = new Blob(['###']);  // Syntax Error
var throwing_script_url = URL.createObjectURL(throwing_script);
var w = new Worker(throwing_script_url);
w.onerror =  e => console.log('Error in Worker, ErrorEvent ?', e instanceof ErrorEvent);

但是错误不会发生在脚本执行之外的其他地方

var throwing_url = 'foo'; // 404
var w = new Worker(throwing_url);
w.onerror =  e => console.log('Error in Worker, ErrorEvent ?', e instanceof ErrorEvent);

在这种情况下,发送的是一个错误,初始化为错误,但是由于没有ErrorEventmessage,{{1} }等进行报告。


因此,在您的情况下,接收ErrorEvent毫无意义。

那么为什么它是一个ProgressEvent而不是一个初始化为“错误”的事件?嗯...确实如此,但是对于AJAX请求,ProgressEvent仍然更有意义。

实际上,对于AJAX部件而言,该请求已正确处理。即使您出于某种原因没有请求的数据,HTTP请求也可以完成它的工作而不会出现 error 。即,它成功发送了请求并收到了响应,即使此响应是因为那里没有要获取的东西,或者您没有被允许获取它。

这只是整个请求的一个步骤(可能是最后一个),因此仍然是ProgressEvent。

但是正如我所说,这确实是一个初始化为“错误”的事件,实际上,如果ProgressEvent继承自Event,并且我们的ProgressEvent在这里将其事件原型初始化为“错误”,您可以在其lineno中看到属性。

colno