2013-10-03 153 views
3

我知道你们都会像“使用计时器!但让我解释一下。 我正在做类似宏的事情,我需要执行一些特定延迟的函数。我知道它可以用定时器完成,但代码如何用50个定时器和50个回调来完成呢?随着睡眠,它可以在一个功能都很好。由于网络工作者在单独的线程上运行,因此不存在冻结问题。Web Worker睡眠

我只知道使睡眠没有吃CPU的2种方法:

  1. 做一个同步XHR请求到休眠由GET给出x秒数额特别的后端。虽然这起作用,但真的很不方便,并且依赖于ping到服务器。
  2. 使用生成函数(yield)并发送消息给启动定时器的主线程。当定时器执行时,消息被发送回工作者继续执行。这是一个非常好的解决方案,但它只在Firefox中提供,据我所知。 Chrome不支持生成器功能。

是否有其他方式实现睡眠功能?

+0

我不知道这是属于StackOverflow的,我打算申请迁移到[Programmers.StackExchange.com](http://Programmers.StackExchange.com),看看版主想什么。 – Malachi

+0

Chrome支持生成器。通过'chrome:// flags /'启用Harmony支持,然后你可以使用'var generator = function *(){/ * do something */yield 1;/*做其他事情*/yield 2;/*完成你的东西* /}; var g = generator(); g.next();/*当你准备好了... */g.next(); //等等 –

回答

0

有解决方案 - 自旋锁。

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

当然,这不是最优的。你的问题表明你已经考虑过发电机。发电机非常适合解决这样的问题。但我们可以使用发电机吗?浏览器中并未广泛采用生成器的本机语法。

但是我们可以使用解决方案构建来支持ES5中的生成器。您可以使用下面transpilers: