4

JSON-APIを10秒ごとに繰り返し、JSONデータで特定のキーが見つかった場合は、同じ接続(キープアライブ)を使用して2番目のHTTPリクエストを実行したいと思います。コードに配置しない EM.stopと、プログラムはreq1.callbackでの処理が終了した後、待機を停止します。

私がEM.stop中に入れるreq2.callbackと、それは機能し、期待どおりに繰り返されます。

ただし、JSONドキュメントにキーが含まれていない場合foobar、プログラムはreq1.callbackでの処理が終了した後、待機を停止します。

EM.stopreq1.callback内の最後の行に追加すると、JSONドキュメントにキーが含まれているとreq2.callbackは中止されますfoobar

EM.stopJSONドキュメントに必要なものが含まれているかどうかを繰り返すには、どのように適切に配置する必要がありますか?

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

このようにして、10 秒ごとに開始/停止する必要はなく、EventMachine を常に実行し続けます。

于 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 に答える