Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.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
Ruby-like JavaScript setTimeout中的非阻塞定时事件_Javascript_Ruby On Rails_Ruby - Fatal编程技术网

Ruby-like JavaScript setTimeout中的非阻塞定时事件

Ruby-like JavaScript setTimeout中的非阻塞定时事件,javascript,ruby-on-rails,ruby,Javascript,Ruby On Rails,Ruby,我需要在类初始化几分钟后更改它的属性。我试图在函数中使用sleep,但它延迟了所有操作的执行: active = true def deactivate sleep 120 puts 'deactivate' active = false end deactivate puts active 我希望发生的是true会先注销,然后两分钟后停用会登录。但是,发生的情况是停用,然后false在两分钟后注销 在JavaScript中,我将执行以下操作: var active = tru

我需要在类初始化几分钟后更改它的属性。我试图在函数中使用
sleep
,但它延迟了所有操作的执行:

active = true

def deactivate
  sleep 120
  puts 'deactivate'
  active = false
end

deactivate
puts active
我希望发生的是
true
会先注销,然后两分钟后
停用
会登录。但是,发生的情况是
停用
,然后
false
在两分钟后注销

在JavaScript中,我将执行以下操作:

var active = true;
setTimeout(function(){
  console.log('deactivate');
  active = false;
},120000);
console.log(active);

此任务看起来过于复杂,但您可以使用在将来异步运行任务

  def deactivate
     puts 'deactivate'
     active = false
  end

  active = true
  handle_asynchronously :deactivate, :run_at => Proc.new { 2.minutes.from_now }
嗯,在我看来(当我尝试这个代码时),激活和停用是不正常的。那么为什么不这样做呢

   active = true

   def deactivate
     sleep 120
     puts 'deactivate'
     active = false
   end

   puts active
   deactivate

它工作得很好。

为什么不将时间存储到激活状态

这样就根本不需要阻塞、回调或运行任何异步操作。当您将
active\u存储到数据库模型中的datetime列中时,它允许您跟踪更改并保持当前
active
状态,即使对应用程序有多个不同的请求:

def active
  active_until.blank? || Time.current < active_until
end

def deactivate
  update_columns(active_until: 2.minutes.since)
end
def激活
激活直到空白时间.电流<有效\u直到
结束
def停用
更新_列(活动_至:2.分钟。自)
结束

根据@ihaztehcodez对线程的建议,我想出了一个简单的解决方案:

Thread.new do
  sleep 120
  puts 'deactivate'
  active = false
end

在这种情况下,他关于持久性的警告并不让我担心,因为我将其用于非关键通知。如果执行非常关键,那么将某些内容存储在@spickermann said之类的数据库中或使用@k-m-rakibul-islam之类的库将是更好的解决方案

谢谢,这对我现在需要的东西来说有点多,但我会在将来记住这一点。另一个选择是在线程中睡觉,我绝对建议在生产应用程序中不要这样做。异步作业绝对是可行的。@ihaztehcodez使用线程看起来确实可行。在生产中使用它会有什么问题?这会使你很难保证你想要的行动会真正发生。例如,部署时,需要重新启动应用程序,这将破坏进程中的线程,任何休眠线程都不会完成执行。或者其他一些事情可能需要终止线程。如果行动很关键,那就不好了@spickermann建议在数据库中存储一个
活动\u,直到
——这实际上似乎是最简单/最好的方法。代码看起来有点不对劲,但想法是可靠的。您的数据库将持续存在,您不必管理作业。我需要在
设置为活动后执行更多代码,然后两分钟后将活动设置为false。我遇到的问题是,在调用所有代码之后,“休眠内部停用”会停止所有代码的执行。@KyleWerner你的意思是,在我调用“活动”之后,它应该停止。我不希望任何东西停止。我希望active为true,并运行它下面的所有代码。两分钟后,active被设置为false,与其他任何内容无关。是的,我正在使用Rails,如果我只需要在需要时读取active属性,那么computed属性就可以工作。计时器启动后,我需要做更多的逻辑工作,比如通过websocket发回通知。他仍然需要一些东西来实际调用
停用
。这将更倾向于异步作业,但我不确定如何使用websocket…他可以在适当的时候自己调用
deactivate
,也可以在初始化后在回调中这样做。注意:此代码不会阻塞(如
pause
will),不会添加外部依赖项(如后台作业),不会立即停用,但2分钟后
active
将不再返回
true
。我觉得我们中的一个人缺少了什么。在被问到的问题中有一些含糊不清的地方,但后来很明显Kyle需要一个积极的回调;被动地确定主动状态是不够的。正如你所说,他将不得不称之为他自己,这将需要外部手段(如背景工作)。我认为你的回答对最初的问题来说是最优雅的,但我不确定它是否符合新的信息。很有可能我错过了什么——现在已经很晚了。如果是这样的话,如果你能解释一下我遗漏了什么,我将不胜感激是的,我最初的问题太模糊了。我对这里的提问有点生疏。我要找的是一个异步作业,它本身启动了操作,不需要检查活动属性。感谢你们两位让我朝着正确的方向思考。这是我参与的其中一个更有趣的问题。很高兴我能帮忙。