首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript -除了最后一个消息之外,如何忽略所有消息?

Javascript -除了最后一个消息之外,如何忽略所有消息?
EN

Stack Overflow用户
提问于 2015-07-11 17:21:09
回答 1查看 853关注 0票数 4

我有一系列UI滑块(dat.GUI),每当UI滑块发生更改时,我都会将滑块值发布给worker。

在工人中所做的计算大约需要3-8秒,直到工人发回我需要的信息。

如果UI接口以较快的速度使用(例如,在第一次计算之前更改了五个滑块),工作人员仍然收到五条消息,并且仍然会对每条消息作出响应,每条新信息覆盖最后一条消息。是否有任何方法让员工忽略中间消息,只在当前计算完成之前对上一次接收的消息执行计算?

我是工人的初学者,所以现在我只使用Worker.onmessage属性和Worker.postMessage()方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-11 17:30:15

这与WebWorker没有多大关系。这似乎是一个典型的退欧用例。这里的问题是,一旦你的员工收到一条信息,它怎么知道这是最后一条?它不能预知未来。它不知道用户是否会在不久的将来进行另一个UI交互。因此,解决这类问题的办法是彻底解决。其想法是,您不立即执行您的代码,但稍等,例如200 is。在这段时间内,如果有另一条消息,那么它将等待另外200毫秒而不做任何事情。您可以自己实现这样的东西,也可以导入和使用一个现有的库,比如underscore.js

编辑:这里是一个使用underscore.js/的例子(两者都有类似的API)。假设最初,您的代码如下所示:

代码语言:javascript
运行
复制
onmessage = function(e) {
    var params = e.data.something;
    // TODO: Do something with params.
};

你会把它改写为..。

代码语言:javascript
运行
复制
onmessage = _.debounce(function(e){
    var params = e.data.something;
    // TODO: Do something with params.
}, 200);

这里发生的事情是,_.debounce返回一个包装器函数,它可以根据需要频繁调用。但是,它不会立即触发包装在里面的函数。它将它安排在200 to内执行(根据您的需要对其进行调整)。在此期间,如果有另一个调用,先前计划的执行将被取消,此时将在200 at内安排一个新的执行。当时间结束时,您的函数将使用最新版本的参数执行。现在,您可能想知道以前调用的参数发生了什么变化?答案是它们被包装函数简单地丢弃了。请注意,传递给onmessage的参数首先传递给包装函数,后者只保留要传递给包装函数的最新参数。您可以使用我在这里创建的小提琴来查看它的运行情况。我想补充的另一个注意事项是,在将其传递给WebWorker之前,您也可以在主线程上执行这个删除逻辑操作。

编辑:,以防您需要关于如何在WebWorker中导入第三方库的指南。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31359805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档