简短版本: 寻找等待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选项,但我不确定这是如何工作的或如何编码它。
这只是现阶段的原型,因此可以接受肮脏的黑客攻击。一旦我证明了功能,就可以在卡片上进行完全重写。
赞赏人们对此的想法和建议。
此致 皮特。
答案 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.
});