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