不同的浏览器如何使用同步XHR处理超时

时间:2012-05-04 18:43:01

标签: firefox timeout xmlhttprequest synchronous

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

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

其他浏览器/旧版Firefox是否实际上在“不应该”的情况下实现超时行为,或者他们只是忽略异常并继续执行(而不是像新的Firefox一样挽救)?

编辑:我现在无法获得代码,但它符合以下方面: if (c.somekindoftimeouthandler !== "unassigned" && this.timeout) {
c.timeout = this.timeout
//more stuff about the handler etc...
}
其中'this'是复杂的东西,可能是从XMLHTTPRequest继承的,而'c'是一个特定的对象,指的是特定的AJAX请求,或者什么。我会很清楚,我对Javascript和这个特定的基于Sugar的CRM知之甚少,但代码的本质很简单。它是一种通用的面向对象的方式来发出请求,当请求超时时,这个特殊的4行左右处理。我得到的印象是这是一个抽象的基础,特定的请求(或请求实体)应该从中专门化。 Firefox Javascript引擎在this.timeout

上窒息

我相信我的问题的主旨更为笼统 - 鉴于使用超时同步XHR的'不良',各种浏览器如何处理它?<​​/ p>

1 个答案:

答案 0 :(得分:3)

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

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

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

所有改变的是Firefox添加了对超时属性的支持,但是它没有按照IE所做的那样实现规范所要做的事情。而且你的脚本假设任何实现该属性的浏览器都会像IE那样行为......