4

简短版本:寻找等待异步 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,但事实证明两者都是错误的选择,至少在现阶段,并且现在已经被抛弃了]。

我觉得回调可能是正确的等待异步选项,但我不确定它是如何工作的或者你将如何编码。

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

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

问候,皮特。

4

1 回答 1

1

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

您可以使用以下onreadystatechange属性设置回调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.
    });
于 2012-04-09T17:04:15.473 回答