JavaScript中一次函数调用期间的多个更新

JavaScript中一次函数调用期间的多个更新,javascript,Javascript,我正在写一些脚本,执行相当繁重的计算。因此,我希望通过更新网站上的内容(例如,已完成计算的分数)来通知用户进度。可以用JavaScript实现吗?JavaScript是否允许在调用的函数仍在运行时更新内容?或者,无论在什么情况下,我都只能在调用的函数完成后更新内容?看看workers: 它是为繁重的计算而设计的(在javascript级别ofc),并带有一些函数来更新用户关于计算状态的信息,它基本上是用javascript进行多线程处理的。看看workers: 它是为繁重的计算而设计的(在jav

我正在写一些脚本,执行相当繁重的计算。因此,我希望通过更新网站上的内容(例如,已完成计算的分数)来通知用户进度。可以用JavaScript实现吗?JavaScript是否允许在调用的函数仍在运行时更新内容?或者,无论在什么情况下,我都只能在调用的函数完成后更新内容?

看看workers:

它是为繁重的计算而设计的(在javascript级别ofc),并带有一些函数来更新用户关于计算状态的信息,它基本上是用javascript进行多线程处理的。

看看workers:


它是为繁重的计算而设计的(在javascript级别ofc),并带有一些函数来更新用户关于计算状态的信息,基本上是javascript中的多线程。

当您的函数运行时,不会发生屏幕更新:UI线程必须像任何其他JS线程一样争取时间。您可以通过安排回调来实现这一点:

function f() {
  a();
  // update now
  b();
}
可以重写为

function f() {
  a();
  setTimeout(function() {
    b();
  }, 0);
}
按照这种方式,在
a()
之后,
setTimeout
将安排函数的其余部分,然后退出。这就是UI线程现在可以(并且将)抓住控制权的地方;然后在完成后,将执行计划的剩余部分


如果你需要做的事情符合(相当严格的)WebWorker限制,你可以使用它们;但是,它们不能触摸UI,因此重绘将毫无意义(除非您按照Antoine所说的那样做,并根据WebWorker计算的参数安排更新函数)。

当您的函数运行时,不会发生屏幕更新:UI线程必须像任何其他JS线程一样争取时间。您可以通过安排回调来实现这一点:

function f() {
  a();
  // update now
  b();
}
可以重写为

function f() {
  a();
  setTimeout(function() {
    b();
  }, 0);
}
按照这种方式,在
a()
之后,
setTimeout
将安排函数的其余部分,然后退出。这就是UI线程现在可以(并且将)抓住控制权的地方;然后在完成后,将执行计划的剩余部分

如果你需要做的事情符合(相当严格的)WebWorker限制,你可以使用它们;但是,它们不能触及UI,因此重画将毫无意义(除非您按照Antoine所说的那样做,并根据WebWorker计算的参数安排更新功能)。

使用

从计算函数中,更新全局变量

然后从主线程使用
setTimeout()
setInterval()
定期查询全局值并更新屏幕。

使用

从计算函数中,更新全局变量


然后从主线程使用
setTimeout()
setInterval()
定期查询全局值并更新屏幕。

是的,可能您可以这样做。我不知道您的问题的所有细节,但您应该以异步和异步为目标


使用node.js您可以实时向客户端发送进程状态,并通过客户端上的socket.io捕获服务器响应。

是的,也许您可以这样做。我不知道您的问题的所有细节,但您应该以异步和异步为目标

使用node.js您可以实时向客户端发送进程状态,并通过客户端的socket.io捕获服务器响应。

我的几分钱:

  • 最简单的解决方法是最常见的简单方法 显示繁忙的动画

  • 尝试将您的重量级计算代码拆分并更新 进度条

  • 或者按照安托万的建议,尝试使用

    • 我的几分钱:

      • 最简单的解决方法是最常见的简单方法 显示繁忙的动画

      • 尝试将您的重量级计算代码拆分并更新 进度条

      • 或者按照安托万的建议,尝试使用


      您可以在语句之间修改屏幕。@ATOzTOA:更准确地说,您可以在语句之间修改DOM,但它不会被渲染。您可以在语句之间修改屏幕。@ATOzTOA:更准确地说,您可以在语句之间修改DOM,但是它不会被渲染。如果你不放弃线程,忙碌的动画将不会动画。真的。但是,我的想法是:目前绝大多数浏览器都不支持。如果你不放弃线程,忙碌的动画将不会动画。真的。但是,我的想法是:目前绝大多数浏览器都不支持。Webworkers不能使用主线程,对吧,但他们不需要。它们可以定期向这个主线程发送信号,主线程可以将它们捕获到事件监听器中,并重新绘制UI。这种方法的主要优点是确保永远不会阻塞主线程。@Antoine:“除非你按照Antoine说的去做……”但如果你的代码不太复杂,那么WebWorkers就做得过火了,将代码分解成可调度的部分就足够了。哦,是的,我看到了这一部分,别误会。我只是想增加与主线程交互的精确度。我同意,关于它可能会被过度使用的事实,OP谈到了“相当繁重的计算”。网络工作者不能利用主线程,对吧,但他们不需要。它们可以定期向这个主线程发送信号,主线程可以将它们捕获到事件监听器中,并重新绘制UI。这种方法的主要优点是确保永远不会阻塞主线程。@Antoine:“除非你按照Antoine说的去做……”但如果你的代码不太复杂,那么WebWorkers就做得过火了,将代码分解成可调度的部分就足够了。哦,是的,我看到了这一部分,别误会。我只是想增加与主线程交互的精确度。关于这可能是过度杀伤力这一事实,我同意,OP谈论的是“相当健康”