不同的浏览器如何处理同步XHR的超时
周三,AJAXy CRM系统维护了很多用户,因为Firefox开始报告“在窗口上下文中同步模式下不支持使用XMLHttpRequest的超时属性”。 其他主流浏览器仍然正常工作,因此我建议人们不要使用Firefox。
根据我的理解,同步请求是一件坏事,所以我只能假设Firefox的最新更新已经阻止它适应坏事。 以前的所有讨论(在这里和网络上)暗示了在同步的时候使用timeout属性XMLHttpRequest对象根本不应该工作,这导致我想知道为什么它显然会这样做(除了截至周三的Firefox)。
其他浏览器/旧版Firefox实际上是在他们“不应该”的地方实现了超时行为,还是他们只是忽略了异常并继续执行(而不是像新的Firefox一样抢救出来)呢?
编辑:我不能到现在的代码,但它是沿着行if (c.somekindoftimeouthandler !== "unassigned" && this.timeout) {
c.timeout = this.timeout
//more stuff about the handler etc...
}if (c.somekindoftimeouthandler !== "unassigned" && this.timeout) {
c.timeout = this.timeout
//more stuff about the handler etc...
}if (c.somekindoftimeouthandler !== "unassigned" && this.timeout) {
其中'this'大概是从XMLHTTPRequest继承而来的复杂的东西,'c'是引用特定AJAX请求的特定对象,或者其他东西。 我会干净的,我对JavaScript和这个特定的基于Sugar的CRM都知之甚少,但代码的本质很简单。 这是一种通用的面向对象的方式来提出请求,并且当请求超时时,这个特定的4行或多行将被处理。 我觉得这是一个抽象的基础,特定的请求(或请求实体)应该专注于这个抽象基础。
c.timeout = this.timeout
//more stuff about the handler etc...
}this.timeout
上的Firefox Javascript引擎窒息。
我相信我的问题的重点是更普遍的 - 鉴于使用超时同步XHR的“糟糕”,各种浏览器如何处理它?
IE允许“超时”为同步XHR工作。 如果达到超时时间,我相信它会从send()中抛出一个异常。
Firefox实现了XHR规范所说的内容:异步XHR支持超时,但不支持同步XHR(如果尝试设置,则抛出)。
其他浏览器(和旧的Firefox)根本不支持超时; 他们甚至没有财产。 由于您的脚本正在嗅探该属性是否存在,因此它甚至不会尝试在其他浏览器中设置超时,这就是为什么它在那里工作的原因:脚本没有试图做坏事,因此这些浏览器不会结束抛出异常。
因此,所有改变都是Firefox增加了对超时属性的支持,但是它并没有执行IE所执行的规范。 而你的脚本假定任何实现该属性的浏览器都会像IE那样行事......
链接地址: http://www.djcxy.com/p/55327.html上一篇: How do the different browsers handle timeout with synchronous XHR
下一篇: search array of nested objects and return parent if value is found in child