1

周三,我维护的 AJAXy CRM 系统对很多用户都崩溃了,因为 Firefox 开始报告“在窗口上下文中的同步模式下不支持使用 XMLHttpRequest 的超时属性”。其他主要浏览器仍然可以正常工作,因此我建议人们不要使用 Firefox。

据我了解,同步请求是一件坏事,所以我只能假设最近对 Firefox 的一些更新已经阻止它适应坏事。之前的所有讨论(此处和网络上)都暗示将 timeout 属性与同步 XMLHttpRequest 对象一起使用根本不应该起作用,这让我想知道为什么它显然会起作用(截至周三在 Firefox 上除外)。

其他浏览器/旧 Firefox 是否真的在“不应该”的地方实现了超时行为,或者他们只是忽略异常并继续执行(而不是像新的 Firefox 那样退出)?

编辑:我现在无法找到代码,但它是这样的: “this”是复杂的东西,大概是从 XMLHTTPRequest 继承的,“c”是指特定 AJAX 请求或其他东西的特定对象。我会坦白说我对 Javascript 和这个基于 Sugar 的特定 CRM 知之甚少,但代码的本质很简单。这是一种通用的面向对象的请求方式,当请求超时时,这个特定的 4 行左右的代码就会被处理。我的印象是这是一个抽象的基础,特定的请求(或请求实体)应该从它专门化。Firefox Javascript 引擎在.if (c.somekindoftimeouthandler !== "unassigned" && this.timeout) {
c.timeout = this.timeout
//more stuff about the handler etc...
}
this.timeout

我相信我的问题的主旨更笼统 - 考虑到使用超时同步 XHR 的“坏处”,各种浏览器如何处理它?

4

1 回答 1

3

IE 允许“超时”用于同步 XHR。如果达到超时时间,我相信它会从 send() 中抛出异常。

Firefox 完全实现了 XHR 规范所说的:异步 XHR 支持超时,但同步 XHR 不支持超时(如果您尝试设置它,则会抛出)。

其他浏览器(和旧的 Firefox)根本不支持超时;他们甚至没有财产。由于您的脚本正在嗅探该属性是否存在,它甚至不会尝试在其他浏览器中设置超时,这就是它在那里工作的原因:您的脚本不会尝试做坏事,所以这些浏览器不会结束向上抛出异常。

所以所有改变的是 Firefox 增加了对 timeout 属性的支持,但它没有做 IE 所做的事情,而是实现了规范所说的事情。而且您的脚本假设任何实现该属性的浏览器都将以 IE 的方式运行...

于 2012-05-05T00:45:10.400 回答