javascript中的非阻塞setTimeout vs ruby​​中的sleep

因此,在javascript中,因为它的性质是事件驱动的,所以似乎setTimeout不会阻塞。 这意味着如果我这样做:

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

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

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

现在我最近一直在玩ruby。 我知道它在事件机器库中具有非阻塞支持。 但是我想知道我们是否可以实现类似于setTimeout的例子我刚刚用javascript写入sleep或ruby中的任何函数而没有事件机器支持? 这是否可能使用闭包过程或块或任何东西? 谢谢。

setTimeout函数完全没有sleep因为前者是异步的而后者是同步的。

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

如果要触发异步回调,可能需要使用EventMachine之类的东西来为您运行事件循环。

您可以通过线程获得一些非常基本的异步行为:

 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,这是一个选择。