替代品的Javascript同步的XMLHttpRequest(如在Safari超时)(Altern

2019-06-23 11:38发布

短版:寻找一种方法来等待非同步XHR请求或方式来获得同步XHR在Safari工作。

更长的版本:我正在使用一起捣碎各种外部数据源的Web服务。 我使用的是Javacript前端,这使得AJAX / XHR调用我的PHP服务器代码。 有没有跨站点问题作为客户端只能从我的服务器(服务器使外部数据请求)请求数据。

我使用同步XHR请求作为我有一些负载后处理(排序,筛选等)被呈现在屏幕上之前,对数据做。

这一切工作正常的IE浏览器,FF和Opera,但似乎是Safari浏览器有问题(我没有尝试过Chrome浏览器还)。

我的Windows机器上使用Firebug的Safari浏览器,我可以看到服务器调用绷进行,然后在它上面10秒的时间后失败。 在我的iPad的消息是稍微尤为明显,因为它说:NETWORK_ERR:XMLHttpRequest的异常101:在同步模式下出现网络错误。

研究的一个位表示Safari会在同步模式下10秒后超时。 似乎有一个超时功能,超时功能,您可以使用扩展这个(与60秒的Safari最大限制)。 不幸的是,我不能得到这个工作。

现在我不知道什么人会建议通过修改客户Javacript代码解决此工作的最佳途径。

这两个选项,我想是(我)找到了同步XHR超时是Safari浏览器上会兑现的工作示例; 或(ii)具有某种围绕非同步XHR呼叫包装的,使得负载的后处理为负载等待第一个。

我不是一个particulalry经验的JavaScript的黑客,但我已经安装在这个项目上有相当数量。 我没有使用JQuery的或其他任何框架,并希望保持与原JS只是为了避免学习额外的语法。 [你可以从我以前的帖子看到我尝试使用过去JQM和轻快,但都被证明是错误的选择,在这个阶段,至少,至今已被抛弃现在。

给我的感觉回调可能是正确的等待换asych选择,但我不知道这是如何工作或你将如何编写它。

这仅仅是在这个阶段的原型,那么脏的黑客是可以接受的。 完全重新写已经在卡后来一旦我已经证明功能。

欣赏这个人民的想法和建议。

问候,皮特。

Answer 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.
    });


文章来源: Alternatives for Javascript Synchronous XMLHttpRequest (as timing out in Safari)