不建议使用同步XMLHttpRequest

今天,由于扩展程序出现问题,我不得不重新启动浏览器。重新启动时发现,我的浏览器(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);

}

以上是 不建议使用同步XMLHttpRequest 的全部内容, 来源链接: utcz.com/qa/411826.html

回到顶部