javascript - Javascript 同步 XMLHttpRequest 的替代方案(在 Safari 中超时)

标签 javascript safari timeout xmlhttprequest

简短版: 寻找等待异步 XHR 请求的方法或让同步 XHR 在 Safari 中工作的方法。

更长的版本: 我正在开发一种使用混合在一起的各种外部数据源的 Web 服务。我正在使用 Javacript 前端,它对我的​​ PHP 服务器代码进行 AJAX/XHR 调用。没有跨站点问题,因为客户端只从我的服务器请求数据(服务器发出外部数据请求)。

我正在使用同步 XHR 请求,因为我需要在数据显示在屏幕上之前对其进行一些加载后处理(排序、过滤等)。

这在 IE、FF 和 Opera 上都可以正常工作,但对 Safari 来说似乎是个问题(我还没有尝试过 Chrome)。

在我的 Windows 机器上使用 Firebug for Safari 我可以看到服务器调用 beng,然后在 10 秒以上的时间后失败。在我的 iPad 上,消息稍微好一点,如下所示:NETWORK_ERR: XMLHttpRequest Exception 101: A network error occurred in synchronous mode.

一些研究表明 Safari 将在同步模式下 10 秒后超时。似乎有一个超时功能,您可以使用该超时功能来扩展它(Safari 的最大限制为 60 秒)。不幸的是我无法让它工作。

我现在想知道人们会建议什么是通过更改客户端 Javacript 代码来解决此问题的最佳方法。

我考虑的两个选项是:(i) 找到 Safari 浏览器将遵守的同步 XHR 超时的工作示例;或者 (ii) 对异步 XHR 调用进行某种包装,以便加载后处理首先等待加载。

我不是特别有经验的 Javascript 黑客,但我已经在这个项目上设置了很多。我没有使用过 JQuery 或任何其他框架,并且更愿意继续使用原始 JS,以避免必须学习额外的语法。 [您可能会从我以前的帖子中看到,我过去曾尝试使用 JQM 和 Spry,但事实证明这两种选择都是错误的选择,至少在现阶段是这样,并且现在已被放弃]。

我感觉回调可能是正确的 wait-for-asych 选项,但我不确定它是如何工作的或您将如何编码。

这只是现阶段的原型(prototype),因此可以接受肮脏的黑客攻击。一旦我证明了功能,完全重写已经在卡片上了。

感谢人们对此的想法和建议。

问候, 皮特。

最佳答案

通常,您会希望坚持使用异步请求,因为它们是非阻塞的。对于它们,您将需要使用回调——或者简单地说,一个设置为稍后调用的函数。

您可以使用 onreadystatechange property 设置回调XMLHttpRequest 的:

xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {   // DONE
        if (xhr.status === 200) { // OK
            handleSuccess(xhr);
        } else {
            handleError(xhr);
        }
    }
};

正如属性名称所暗示的那样,它将在 readyState 的值发生变化时被调用,其中 4 的值表示请求已完成(成功或不成功)。

然后,您将在另一个函数中处理排序、过滤等 - 在本例中为 handleSuccess

您还可以从使用许多现有库中的任何一个中获益 -- 例如,jQuery (此代码段为 1.6 或更高版本):

$.get('/web/service/request')
    .done(function (result) {
        // sorting, filtering, etc
    })
    .fail(function (xhr) {
        // error notification, etc.
    });

关于javascript - Javascript 同步 XMLHttpRequest 的替代方案(在 Safari 中超时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10076614/

相关文章:

html - 仅限 Safari - 菜单出现在错误的位置

perl - LWP::UserAgent 请求方法的真正超时

如果当前滚动位置靠近底部,则javascript滚动到div的底部

javascript - Jquery XML 解析

Javascript原型(prototype)继承

azure - 如果 blob.upload 花费超过 60 秒,则续订 blob 租约

Perl 超时输出消息

javascript - ng-if 内的 ng-repeat 不起作用

html - 字间距在 safari 中不起作用

java - 为什么 Java 在尝试开发我的应用程序时会缓存它