不推荐使用同步XMLHttpRequest

时间:2015-03-28 08:05:49

标签: ajax xmlhttprequest deprecated chromium synchronous

今天,由于扩展程序的某些问题,我不得不重新启动浏览器。我在重新启动时发现的是,我的浏览器(Chromium)自动更新为新版本,不再允许同步AJAX请求。引用:

  

主线程上的同步XMLHttpRequest因不推荐使用   它对最终用户的体验产生不利影响。如需更多帮助,   检查http://xhr.spec.whatwg.org/

我需要为我的node.js应用程序提供同步AJAX请求,因为它们通过使用fopen的服务器从磁盘存储和加载数据。我发现这是一种非常简单有效的处理方式,在创建小爱好项目和编辑器时非常方便......有没有办法在Chrome / Chromium中重新启用同步XMLHttpRequests?

2 个答案:

答案 0 :(得分:1)

此答案已经过编辑。

简答: 他们不想在主题上进行同步。

对于支持线程/网络工作者的新浏览器,解决方案很简单:

var foo = new Worker("scriptWithSyncRequests.js")

DOM和全局可变量都不会在工作者中可见,但是多个同步请求的封装将非常简单。

替代解决方案是切换到异步,但使用浏览器localStorage和JSON.stringify作为媒介。如果允许执行某些IO,则可以模拟localStorage。 http://caniuse.com/#search=localstorage

只是为了好玩,如果我们想要仅使用同步来限制我们的自我,那么还有其他黑客攻击:

使用setTimeout很有诱惑力,因为人们可能认为这是将同步请求封装在一起的好方法。可悲的是,有一个问题。 javascript中的异步并不意味着它可以在自己的线程中运行。异步可能会推迟通话,等待其他人完成。幸运的是,隧道尽头有光,因为很可能你可以使用xhttp.timeout和xhttp.ontimeout来恢复。见Timeout XMLHttpRequest 这意味着我们可以实现处理失败请求的小型版本的调度,并分配时间再试一次或报告错误。

// The basic idea.
function runSchedular(s)
{
    setTimeout(function() {
        if (s.ptr < callQueue.length) {
            // Handles rescheduling if needed by pushing the que.
            // Remember to set time for xhttp.timeout.
            // Use xhttp.ontimeout to set default return value for failure.
            // The pushed function might do something like: (in pesudo)
            // if !d1
            // d1 = get(http...?query);
            // if !d2
            // d2 = get(http...?query);
            // if (!d1) {pushQue tryAgainLater}
            // if (!d2) {pushQue tryAgainLater}
            // if (d1 && d2) {pushQue handleData}
            s = s.callQueue[s.ptr++](s);
        } else {
            // Clear the que when there is nothing more to do.
            s.ptr = 0;
            s.callQueue = [];
            // You could implement an idle counter and increase this value to free
            // CPU time.
            s.t = 200;
        }
        runSchedular(s);
    }, s.t);
}

答案 1 :(得分:0)

不被弃用&#34;意味着它可以使用,但不会永远存在。 (我在其他地方读过,它已经好几年没有消失了。)如果是这样,这是为了爱好项目,那么也许你现在可以使用async: false作为快速获取干完了吗?