尽管有webworker,UI元素仍会冻结

时间:2017-05-02 14:40:22

标签: javascript web-worker

我正在开发一个简单的排序算法演示应用程序。我有一些用JavaScript编写的排序算法,还有一个用于试用它们的HTML页面。我已经单独测试了算法,它们工作正常。

您可以输入自己的数组,也可以为您生成随机数组。如果数组的大小太大,无论是生成它还是对其进行排序,都会挂起UI,所以我添加了一个在单独的线程中执行这些操作的webworker。

该应用记录它正在做的事情。在Web工作者之前,当使用非常大的数组时,只有在完成该过程之后,日志才会突然出现,但是由于webworker,每个步骤完成后就会出现日志。此外,页面仍然可滚动,而没有工作人员,一切都会冻结,直到工作完成。

将计算量很大的元素委托给webworker后,我期待页面上的元素保持完全交互,但事实并非如此。无论如何,页面上的所有按钮等都无响应。确切地说,它们在很短的时间内保持交互,然后冻结 - 例如,如果我鼠标悬停在按钮上,光标将改变形状,但无论我在何处移动它,它都将保持冻结状态,如果我点击,直到webworker完成工作后才会注册。这是一个问题,因为我有“停止”按钮,如果生成数组或对其进行排序,用户可能会单击以停止webworker。事实上,停止按钮会冻结,如果你点击它们,这只会在工人完成之后产生效果,有效地使它们变得无用。

如何确保页面上的控件仍然可用?谢谢!

1 个答案:

答案 0 :(得分:0)

所以,我遇到了我认为同样的问题,并且已经忍受了几天的时间。谢天谢地,我碰到了这个:https://regex101.com/r/6ZKH3f/1/

出于某种原因,在Chrome和Firefox上,当webworkers发布消息时,它会在打包数据的过程中冻结主线程。

如果您在发布消息时使用JSON完全序列化所有对象,那么它似乎可以使所有内容运行得更顺畅。