javascript - 简单的 Javascript 更新 HTML 中的长计算进度

标签 javascript html logging progress

我正在运行一个长循环,需要报告循环的进度。

var mLog=document.getElementById("log");
for (n = 2; (n<10000 && calc_power<power); n=n*2)
{
  calc_power=chi_power(n,w,df,delta1,alfa);
  var message="n="+n+"<br>";
  window.setTimeout(progress(mLog,message), 0);
}

function progress (mLog,message)
{  
  mLog.innerHTML+=message;
}

我按照建议使用了 window.setTimeout,但 HTML 页面更新仅在循环结束后才会完成...

最佳答案

循环是同步的,因此它将一直运行,直到在执行 setTimeout() 中的任何函数之前结束。

您必须将循环转换为函数,以便它可以使用 setTimeout 回调自身:

var mLog = document.getElementById("log");

var w, df, delta1, alfa;            // fake implementation, for demo only
function chi_power(n) { return n; } // fake implementation, for demo only

var calc_power = 0, power = 5000;   // fake data, for demo only

function calculate(n) {
  if (n<10000 && calc_power<power) {
    calc_power=chi_power(n,w,df,delta1,alfa);
    var message="n="+n+"<br>";
    progress(mLog,message);

    // proceed with the loop
    setTimeout(function () { calculate(n*2); }, 0);
  }
}

function progress(mLog, message) {
  mLog.innerHTML += message;
}

calculate(2);
<div id="log"></div>

关于javascript - 简单的 Javascript 更新 HTML 中的长计算进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49502842/

相关文章:

javascript - 如何从必须在目标页面范围内运行的代码中调用 Greasemonkey 的 GM_ 函数?

javascript - 处理 Angular 5 选项字段中的 bool 过滤器?

java - 如何将 log4j2 配置为在启动时使用时间戳翻转?

r - 如何阻止 h2o 将大量 .ERR、.OUT 和其他日志文件保存到本地驱动器

java - 为写入 Java 标准输出的所有消息添加前缀

javascript - CKEditor:通过 JS 将编辑器焦点从内联编辑器中逃脱(无需单击鼠标)?

javascript - 从云函数中的 firebase 读取

php - 表单外的表单元素

jquery - 网站在 Firefox 中加载缓慢

javascript - 相对于形状位置而不是 Canvas 位置的渐变填充?