当前位置: 首页 > 面试题库 >

不建议使用同步XMLHttpRequest

邬友樵
2023-03-14
问题内容

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

不赞成在主线程上使用同步XMLHttpRequest,因为它会对最终用户的体验产生不利影响。如需更多帮助,请访问http://xhr.spec.whatwg.org/。

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


问题答案:

该答案已被编辑。

简短的答案: 他们不想在 线程上同步。

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

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

DOM和全局变量都不在工作线程中不可见,但是封装多个同步请求将变得非常容易。

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

只是为了好玩,如果我们只想使用sync来限制自己,就可以使用其他方法:

使用setTimeout很有诱惑力,因为有人可能认为这是将同步请求封装在一起的一种好方法。可悲的是,有一个陷阱。javascript中的异步并不意味着它可以在自己的线程中运行。异步可能会推迟呼叫,等待其他人完成。对我们来说幸运的是,隧道尽头有光,因为您很可能可以同时使用xhttp.timeout和xhttp.ontimeout进行恢复。请参阅超时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);
}


 类似资料:
  • 问题内容: 我正在使用jQuery 1.7,并且已将其用于AJAX记录,但是我了解到该功能已被弃用。 我需要使用回调,但这不起作用: HTML: 问题答案: 继续评论:当您似乎不需要 回调时 ,您似乎对它有些痴迷!:) 对现有代码的简单更改是丢弃并简单地将代码放入ajax调用的成功部分:

  • 问题内容: 知道 对于声明为volatile的所有变量,读写是原子的 问题1: 这是否可以理解为 操作是原子的吗? 然后 将变量标记为volatile并不能消除所有同步原子操作的需要,因为仍然可能发生内存一致性错误。 问题2: 我想知道在什么情况下(如果有的话)有可能看到一个已标记的变量,而看不到任何标记为已同步的块的方法(试图访问/修改该变量)? 换句话说,是否需要标记所有需要防止并发修改的变量

  • 问题内容: 我有以下代码将JasperReprot导出到XLS: 升级到 JasperReports 5.6, 所有setParameter都标记为“已弃用”,我找不到适合此代码的文档。 如何使用 JasperReports 5.6 将报告导出到xls ? 问题答案: JRExporter在5.6中已弃用。他们引入了新的接口Exporter,并对所有的Exporter进行了改造,使其具有Expor

  • 问题内容: 我已经开始学习Java的并发和线程。我知道同步的基础知识(即它的作用)。从概念上讲,我知道它提供了对Java中具有多个线程的共享资源的互斥访问。但是,当面对下面的示例时,让我感到困惑的是同步它是否是一个好主意。我知道代码的关键部分应该同步,并且不应过度使用此关键字,否则会影响性能。 问题答案: 假设每个线程通过 不同的数组, 则不需要同步,因为其余变量是局部的。 相反,如果您触发所有调

  • 问题内容: 我有这种方法: 不幸的是,编译器向我显示了以下问题: 因为已弃用。 不使用该如何改写此方法? 问题答案: 您可以用和替换它(您需要使用兼容性包来支持API版本11之前的设备)。 但是,您似乎只使用了一次查询:您甚至可能不需要它。也许这行得通吗?

  • 问题内容: 我最近一直在使用Hibernate 3.5和Spring 3进行一些工作,但是我对Hibernate还是比较陌生,并认为Spring中的类使将Hibernate与我的域类一起使用变得容易且容易。 但是,在搜索一个不相关的问题时,我看到有人提到,这不是使用Spring和Hibernate的最佳方法。任何人都可以阐明以下几点: 为什么不推荐? 整合Hibernate和Spring的最佳方法