我有一个Ajax调用,目前需要同步。但是,在执行此Ajax调用时,浏览器界面会冻结,直到调用返回。如果超时,可以冻结浏览器significant period of time。
有没有办法让浏览器(任何浏览器)刷新用户界面,但不执行任何Javascript?理想情况下,它会像window.update()
这样的命令,它会让用户界面线程刷新。
如果可以,那么我可以用以下内容替换同步AJAX调用:
obj = do_async_ajax_call();
while (!obj.hasReturned()) {
window.update();
}
// synchronous call can resume
我不能在回调中使用setTimeout
或恢复函数的原因是执行流程不能被中断:(有太多的状态变量都相互依赖,并且否则必须以某种方式恢复long_function()
流程:
function long_function() {
// lots of code, reads/writes variable 'a', 'b', ...
if (sync_call_is_true()) {
// lots of code, reads/writes variable 'a', 'b', ...
} else {
// lots of code, reads/writes variable 'a', 'b', ...
}
// lots of code, reads/writes variable 'a', 'b', ...
return calculated_value;
}
答案 0 :(得分:3)
您需要使用异步请求替换同步请求并使用回调。一个过于简单的例子是:
obj = do_async_ajax_call(function (data, success)
{
if (success)
{
// continue...
}
});
function do_async_ajax_call(callback)
{
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://mysite.com", true);
xhr.onreadystatechange = function ()
{
if (xhr.readyState == 4 && xhr.status == 200)
callback(xhr.responseXML, true);
else if (xhr.readyState == 4)
callback(null, false);
}
xhr.send();
}
这样你就可以将匿名函数作为参数传递给ajax请求函数。当ajax完成时,传递的函数将被传递给它的responseXML。与此同时,在呼叫完成之前,浏览器可以自由地执行此操作。从这里开始,其余代码将继续。
答案 1 :(得分:0)
接受剩余的调用并将其放入结果返回时调用的回调中。我严重怀疑这对你来说是完全不可能的。您需要在呼叫中复制的任何逻辑都可以在回调中复制
答案 2 :(得分:0)
异步ajax fetch然后settimeout并以块为单位进行处理工作(由回调触发)
答案 3 :(得分:0)
JavaScript是单线程的。因此,根据定义,您无法在潮流中更新UI。但是,从Firefox 3.5开始,增加了对称为web worker的多线程JavaScripts的支持。 Web worker不会影响页面的UI,但它们也不会阻止UI的更新。 Chrome和Safari也支持我们的工作人员 问题是,即使您将AJAX调用移动到后台线程并等待执行完成,用户也可以按下按钮并更改UI上的值(据我所知,这就是您要尝试的内容)避免)。我建议阻止用户进行任何更改的唯一方法是阻止整个UI的微调器,并且在网络调用返回之前不允许与页面进行任何交互。