Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 如何在Sinatra应用程序中使用EventMachine?_Ruby_Sinatra_Eventmachine - Fatal编程技术网

Ruby 如何在Sinatra应用程序中使用EventMachine?

Ruby 如何在Sinatra应用程序中使用EventMachine?,ruby,sinatra,eventmachine,Ruby,Sinatra,Eventmachine,我使用了一个写在EM之上的api。这意味着要进行调用,我需要编写如下内容: EventMachine.run do api.query do |result| # Do stuff with result end EventMachine.stop end 很好 但现在我想在Sinatra控制器中使用相同的API。我试过这个: get "/foo" do output = "" EventMachine.run do api.query do |result

我使用了一个写在EM之上的api。这意味着要进行调用,我需要编写如下内容:

EventMachine.run do
  api.query do |result|
    # Do stuff with result
  end
  EventMachine.stop
end
很好

但现在我想在Sinatra控制器中使用相同的API。我试过这个:

get "/foo" do
  output = ""
  EventMachine.run do
    api.query do |result|
      output = "Result: #{result}"
    end
    EventMachine.stop
  end
  output
end
但这不起作用。
run
块被绕过,因此返回一个空响应,一旦调用了
stop
,Sinatra就会关闭

不确定是否相关,但我的Sinatra应用程序运行在瘦版上


我做错了什么?

我找到了一个解决办法,忙着等待数据可用。可能不是最好的解决方案,但至少可以:

helpers do

  def wait_for(&block)
    while (return_val = block.call).nil?
      sleep(0.1)
    end
    return_val
  end

end

get "/foo" do
  output = nil
  EventMachine.run do
    api.query do |result|
      output = "Result: #{result}"
    end
  end
  wait_for { output }
end

可能会对您有所帮助。请参阅本文:Sinatra中有用于异步请求处理的库。例如以下是我关于一个相关主题的帖子: