Web Worker 休眠

4

我知道你们都会说"用定时器!",但是让我解释一下。

我正在制作类似宏的东西,需要在特定时间延迟后执行函数。我知道可以使用定时器来实现,但如果有50个定时器和50个回调函数,代码会是什么样子?使用“sleep”函数,所有代码可以很好地集中在一个函数中。由于Web Worker在单独的线程上运行,所以不存在冻结的问题。

我只知道两种不会占用CPU的制作睡眠功能的方法:

  1. 发出同步XHR请求到一个特殊的后端,该请求会让服务器等待GET给定的x秒钟。虽然这个方法可行,但非常不方便,并且取决于与服务器的ping值。
  2. 使用生成器函数(yield)并发送一条消息到主线程,该消息启动一个定时器。当定时器执行时,消息被发送回Worker以继续执行。这是一个非常好的解决方案,但据我所知,只适用于Firefox。Chrome不支持生成器函数。

还有其他实现睡眠功能的方法吗?


我不确定这是否适合在StackOverflow上发布,我将标记为迁移到Programmers.StackExchange.com,并查看管理员的意见。 - Malachi
Chrome支持生成器。通过chrome://flags/启用Harmony支持,然后您可以使用var generator = function*() { /*do something*/ yield 1; /* do something else*/ yield 2; /* finish your stuff */}; var g = generator();g.next(); /*when you're ready...*/ g.next(); // etc创建一个生成器。 - Rob W
1个回答

0

有解决方案 - 自旋锁。

var d1 = Date.now();
while(Date.now() < d1+50) {
     // do nothing
}

当然,这并不是最优解。你的问题说明你已经考虑过生成器了。生成器非常适合解决这类问题。但我们能使用生成器吗?原生语法的生成器在浏览器中并没有被广泛采用。

但我们可以使用为支持 ES5 中生成器而构建的解决方案。你可以使用以下转译器:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接