是否可以在Javascript循环中获取更新的浏览器窗口?

时间:2010-02-03 00:05:11

标签: javascript ajax firefox javascript-events user-interface

我有一个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;
}

4 个答案:

答案 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的微调器,并且在网络调用返回之前不允许与页面进行任何交互。