javascript - 是否可以在 Javascript 循环中更新浏览器窗口?

标签 javascript ajax user-interface firefox dom-events

我有一个当前需要同步的 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;
}

最佳答案

您需要将同步请求替换为异步请求并使用回调。一个过于简单的例子是:

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 传递给它。与此同时,在调用完成之前,浏览器一直可以自由地做它平常的事情。从这里开始,您的其余代码将继续。

关于javascript - 是否可以在 Javascript 循环中更新浏览器窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2188733/

相关文章:

javascript - r pkgdown docsearch algolia

javascript - jQuery 类验证有效!但返回 "property ' 长度' of null“错误?

asp.net - 哪个 JavaScript 或 ASP.NET 图表组件/工具/库适用于此?

Javascript 变量赋值 - 类别明智

php - 为什么这个ajax脚本不使用ajaxRequest.open调用后端php?

java - 如何将用户输入功能添加到我的 eclipse 插件中?

javascript - 尝试单击 asp :LinkButton with jQuery

javascript - 获取视频列表 youtube api

java - 监听 JTabbedPane 面板上的选项卡开关

javascript - 在 JavaScript 中计算窗口拖动和倾斜