4

我想每 10 秒迭代一次 JSON-API,如果在 JSON 数据中找到某个密钥,则使用相同的连接(保持连接)执行第二个 HTTP 请求。如果我没有放入 EM.stop我的代码,程序在 req1.callback 中完成处理后停止等待。

如果我把它EM.stop放进去,req2.callback它就可以工作并且按预期进行迭代。

但是如果 JSON 文档中没有包含 key foobar,则程序在 req1.callback 中完成处理后停止等待。

如果我EM.stop在 req1.callback 中的最后一行添加,如果 JSON 文档具有 key ,则 req2.callback 将中止foobar

如果 JSON 文档有我想要的,我应该如何正确放置EM.stop以使其迭代?

require 'eventmachine'
require 'em-http'

loop do    
  EM.run do
    c = EM::HttpRequest.new 'http://api.example.com/'

    req1 = c.get :keepalive => true
    req1.callback do
      document = JSON.parse req1.response
      if document.has_key? foobar   
        req2 = c.get :path => '/data/'
        req2.callback do
          puts [:success, 2, req2]
          puts "\n\n\n"
          EM.stop
        end
      end
    end
  end

  sleep 10
end
4

2 回答 2

2

如果要使用计时器,则应使用 EM 提供的实际计时器支持:http: //eventmachine.rubyforge.org/EventMachine.html#M000467

例如:

require 'eventmachine'
require 'em-http'

EM.run do
  c = EM::HttpRequest.new 'http://google.com/'
  EM.add_periodic_timer(10) do
    # Your logic to be run every 10 seconds goes here!
  end
end

这样,您可以让 EventMachine 一直运行,而不必每 10 秒启动/停止它。

于 2012-04-25T15:07:27.613 回答
0
require 'eventmachine'
require 'em-http'

loop do    
  EM.run do
    c = EM::HttpRequest.new 'http://google.com/'

    req1 = c.get :keepalive => true
    req1.callback do
      begin
        document = JSON.parse req1.response
        if document.has_key? foobar   
          req2 = c.get :path => '/data/'
          req2.callback do
            puts [:success, 2, req2]
            puts "\n\n\n"
            EM.stop
          end
        end
      rescue => e
        EM.stop
        raise e
      end
    end
    req1.errback do
      print "ERROR"
      EM.stop
    end
  end

  sleep 10
end
于 2012-04-25T13:58:56.267 回答