今天,由于扩展程序的某些问题,我不得不重新启动浏览器。我在重新启动时发现的是,我的浏览器(Chromium)自动更新为新版本,不再允许同步AJAX请求。引用:
主线程上的同步XMLHttpRequest因不推荐使用 它对最终用户的体验产生不利影响。如需更多帮助, 检查http://xhr.spec.whatwg.org/。
我需要为我的node.js应用程序提供同步AJAX请求,因为它们通过使用fopen的服务器从磁盘存储和加载数据。我发现这是一种非常简单有效的处理方式,在创建小爱好项目和编辑器时非常方便......有没有办法在Chrome / Chromium中重新启用同步XMLHttpRequests?
答案 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
作为快速获取干完了吗?