Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的非阻塞setTimeout与ruby中的sleep_Javascript_Ruby On Rails_Ruby_Asynchronous - Fatal编程技术网

javascript中的非阻塞setTimeout与ruby中的sleep

javascript中的非阻塞setTimeout与ruby中的sleep,javascript,ruby-on-rails,ruby,asynchronous,Javascript,Ruby On Rails,Ruby,Asynchronous,所以,在javascript中,由于事件是由其性质驱动的,所以setTimeout似乎不会阻塞。这意味着如果我这样做: setTimeout(function(){ console.log('sleeping'); }, 10); console.log('prints first!!'); 它将输出“先打印!!”然后“睡觉” js解释器不会等到setTimeout完成,而是会立即执行下面的代码。当10ms过去时,它执行回调函数 最近我一直在玩ruby。我知道它在事件机库中具有非阻塞支持。

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

setTimeout(function(){
  console.log('sleeping');
}, 10);
console.log('prints first!!');
它将输出
“先打印!!”
然后
“睡觉”

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


最近我一直在玩ruby。我知道它在事件机库中具有非阻塞支持。但我想知道我们是否可以实现类似于我刚刚用javascript编写的带有
sleep
的setTimeout示例,或者ruby中的任何函数,而不支持事件机?使用closureproc或block或其他方法是否可以实现这一点?谢谢

设置超时功能与睡眠完全不同,因为前者是异步的,后者是同步的

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


如果要触发异步回调,可能需要运行事件循环之类的操作。

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

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
timeout=Thread.new(Time.now+3)do | end|u Time|
while Time.now<结束时间
线程传递
结束
“叮!”
结束
main=Thread.new do
把“主”
结束
main.join
超时。加入

我不知道你是否想走线程编程的道路。这对我来说似乎有些过分,但如果你不能使用EventMachine,这是一个选项。

是的,线程看起来不会是我要使用的东西。我知道异步需要用事件机完成,但我只是好奇。感谢线程触发异步回调的最大问题是试图在调用线程上强制执行回调块。这是很棘手的,除非您有一个适当的事件循环,其中有定义良好的位置来执行它们。