Ajax 不推荐使用同步XMLHttpRequest

Ajax 不推荐使用同步XMLHttpRequest,ajax,xmlhttprequest,deprecated,chromium,synchronous,Ajax,Xmlhttprequest,Deprecated,Chromium,Synchronous,今天,由于扩展出现问题,我不得不重新启动浏览器。当我重新启动它时,我发现我的浏览器(Chromium)自动更新到一个新版本,不再允许同步AJAX请求。引述: 主线程上的同步XMLHttpRequest已被弃用,因为 它会对最终用户的体验产生不利影响。要获得更多帮助, 检查 不过,我需要同步AJAX请求才能让node.js应用程序正常工作,因为它们使用fopen通过服务器存储和加载磁盘数据。我发现这是一种非常简单有效的做事方式,在创建小爱好项目和编辑时非常方便。。。是否有办法在Chrome/Chr

今天,由于扩展出现问题,我不得不重新启动浏览器。当我重新启动它时,我发现我的浏览器(Chromium)自动更新到一个新版本,不再允许同步AJAX请求。引述:

主线程上的同步XMLHttpRequest已被弃用,因为 它会对最终用户的体验产生不利影响。要获得更多帮助, 检查


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

此答案已编辑

简短回答: 他们不想在主线程上同步

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

var foo = new Worker("scriptWithSyncRequests.js")
DOM和全局变量在工作程序中都不可见,但封装多个同步请求将非常容易

另一种解决方案是切换到async,但同时使用browser和JSON.stringify作为媒介。如果允许执行一些IO,您可能可以模拟localStorage。

只是为了好玩,如果我们想限制自己只使用同步,还有其他黑客:

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

// 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);
}
//基本思想。
函数运行调度程序
{
setTimeout(函数(){
if(s.ptr
不推荐使用并不意味着它可以使用,但不会永远使用。(我在其他地方读到,它将在数年内不会消失。)如果是这样的话,并且这是用于爱好项目,那么也许您现在可以使用
async:false
作为完成工作的快速方法?

“对于旧浏览器支持”旧浏览器将继续支持同步请求,因此,可能不太需要上述替代解决方案。如果浏览器支持worker,则执行x,否则执行y@KevenB看,我认为你在这一点上是对的,没有必要使用它们。@Keven B至于“y”部分,如果这意味着通过链接进行异步请求,那么我想知道其他解决方案。有其他解决方案肯定很好,它们确实会让你的答案更好。我只是想指出,并非所有情况下都需要它们。把它们包括在答案中没有什么错。@kevenb这些选择肯定不是第一选择!我将更新答案以反映这一点。