【发布时间】:2015-07-11 17:21:09
【问题描述】:
我有一系列 UI 滑块 (dat.GUI),每当 UI 滑块发生变化时,我都会将滑块值发布给 Web Worker。
在工作人员中完成的计算大约需要 3-8 秒,直到工作人员发回我需要的信息。
如果 UI 界面被快速使用(例如,在第一次计算完成之前更改了 5 个滑块),worker 仍然收到了 5 条消息,并且仍然会响应每条消息,每条新信息都会覆盖最后一个。工人有什么办法可以忽略中间消息,只在当前计算完成之前使用最后收到的消息执行计算?
我是工人的初学者,所以现在我只使用 Worker.onmessage 属性和 Worker.postMessage() 方法。
【问题讨论】:
-
告诉我们更多关于您的架构的信息。现在工人怎么会是最后一条消息?如果是提前知道的,那为什么其他消息一开始就发给worker呢?
-
使用
debounce怎么样?它会稍微延迟处理,如果在此延迟期间收到一条新消息,它会丢弃第一个消息并将新消息延迟一点,重复此操作直到消息停止发送。 -
@doldt 发送所有消息是因为每次一个滑块值发生更改时都应执行新计算,但同时用户可以随时继续使用或停止使用滑块,所以我这样做不知道哪个是最后一条只发送的消息。我想“工人怎么知道最后一条消息”是我自己问题的一部分。
-
@DCoder 我会检查 debounce 是什么,看看它是否有帮助,即使我更愿意避免延迟处理,我正在寻找如何完全跳过处理轮次,以防多条消息有被堆叠了。
-
@des 我看到您想在收到新消息后终止先前处理的任务。请记住,这种方法存在一些挑战。工作人员本身是严格的单线程。这就是 JavaScript 避免同步问题的方式。因此,假设您的工作人员收到一条消息,然后开始了一个需要 5 秒的超级密集程序。然后用户在 1 秒后进行另一个 UI 交互,因此向同一个工作人员发送了一条新消息。工作线程的
onmessage回调要等到 4 秒后线程释放时才会启动。
标签: javascript web-worker postmessage