2012-02-16 40 views
5

所以,在JavaScript中,因为它的本质是事件驱动的,所以似乎setTimeout不会阻塞。这意味着,如果我这样做:javascript中的非阻塞setTimeout与ruby中的睡眠

setTimeout(function(){ 
    console.log('sleeping'); 
}, 10); 
console.log('prints first!!'); 

它将输出'prints first!!'然后'sleeping'

js解释器不会等到setTimeout完成,而是立即执行下面的代码片段。当10ms通过时,它执行回调函数。

现在我最近一直在玩红宝石。我知道它在事件机器库中具有非阻塞支持。但是我不知道我们是否可以实现类似于setTimeout的例子,我用javascript写了sleep或者本地没有事件机器支持的ruby中的任何函数?这完全可以使用闭包过程或块或任何东西?谢谢。

回答

5

setTimeout函数完全没有像sleep这样的函数,因为前者是异步的,后者是同步的。

Ruby sleep方法与其POSIX对应方法一样暂停脚本的执行。 JavaScript中的setTimer函数将在未来触发回调。

如果你想触发一个异步回调,你可能需要类似EventMachine来为你运行一个事件循环。

2

你可以得到与线程一些非常基本的异步行为:

timeout = Thread.new(Time.now + 3) do |end_time| 
    while Time.now < end_time 
    Thread.pass 
    end 
    puts "Ding!" 
end 

main = Thread.new do 
    puts "Main" 
end 

main.join 
timeout.join 

如果你想下去线程编程的路上,我不知道。这对我来说似乎有点矫枉过正,但如果您不能使用EventMachine,则这是一个选项。

+0

是的,它看起来不像线将会是我将使用的东西。我知道异步需要使用事件机器完成,但我只是好奇。谢谢 – 2012-02-16 04:35:40

+0

线程触发异步回调的大问题是试图强制执行调用线程上的回调块。这很棘手,除非你有一个适当的事件循环,在那里有明确的地方来执行它们。 – tadman 2012-02-16 05:23:43