Javascript同步XMLHttpRequest的替代方案(作为Safari中的超时)

时间:2012-04-09 16:48:13

标签: javascript safari timeout xmlhttprequest

简短版本: 寻找等待Asynch XHR请求的方法或让Synch XHR在Safari中工作的方法。

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

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

这一切都适用于IE,FF和Opera,但似乎是Safari的问题(我还没有尝试过Chrome)。

在我的Windows机器上使用Firebug for Safari我可以看到服务器调用beng,然后在超过10秒后失败。在我的iPad上,消息稍微有些说法:NETWORK_ERR:XMLHttpRequest例外101:同步模式下发生网络错误。

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

我现在想知道人们会建议通过更改客户端Javacript代码来解决这个问题的最佳方式。

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

我不是一位经验丰富的Javascript黑客,但我在这个项目上设置了相当数量。我没有使用过JQuery或任何其他框架,并且更愿意继续使用原始JS,以避免必须学习其他语法。 [你可以从我以前的帖子中看到我过去尝试过使用JQM和Spry,但两者都被证明是错误的选择,至少在这个阶段已经被淘汰了。)

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

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

赞赏人们对此的想法和建议。

此致 皮特。

1 个答案:

答案 0 :(得分:2)

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

您可以使用XMLHttpRequest的{​​{3}}设置回调:

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

正如属性名称所示,它将被调用为readyState更改的值,其中值4表示请求已完成(成功与否)。

然后,您将在另一个函数中处理排序,过滤等操作 - 在此示例中为handleSuccess

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

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