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

jev*_*von 6 javascript ajax firefox user-interface javascript-events

我有一个Ajax调用,目前需要同步.但是,在执行此Ajax调用时,浏览器界面会冻结,直到调用返回.在超时的情况下,这可能会冻结浏览器很长一段时间.

有没有办法让浏览器(任何浏览器)刷新用户界面,但不执行任何Javascript?理想情况下,这将是一些命令window.update(),它将让用户界面线程刷新.

如果这是可能的,那么我可以用以下代码替换同步AJAX调用:

obj = do_async_ajax_call();
while (!obj.hasReturned()) {
  window.update();
}
// synchronous call can resume
Run Code Online (Sandbox Code Playgroud)

我不能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;
}
Run Code Online (Sandbox Code Playgroud)

And*_*y E 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();
}
Run Code Online (Sandbox Code Playgroud)

这样您就可以将匿名函数作为参数传递给 ajax 请求函数。当 ajax 完成时,将调用传递给它的responseXML 的函数。与此同时,浏览器可以自由地执行通常的操作,直到调用完成。从这里开始,代码的其余部分将继续。