2012-04-25 9 views
4

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

req2.callbackの中にEM.stopを入れて、期待どおりに反復しています。

しかし、JSON文書にキーfoobarが含まれていない場合、req1.callbackでの処理が完了した後でプログラムの待機が停止します。

req1.callbackの最後の行にEM.stopを追加すると、JSONドキュメントのキーがfoobarの場合、req2.callbackが中止されます。

EM.stopを適切に配置して、JSON文書に必要なものがあるかどうかを確認するにはどうすればよいですか?

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 

答えて

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秒ごとに開始/停止するのではなく、全体の時間を記録します。

+0

私にとって完璧なソリューション!無限ループとスリープで「ハック」するよりも、この組み込み機能を使用する方が理にかなっています。 – pkhamre

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 
+0

これを試してみましたが、 'req1.callback'の中に入ることは決してありません。助言がありますか? – pkhamre

+0

私は私の答えを更新しました – fl00r

+0

ありがとう!私はこれを試してみるのがいいでしょう。 – pkhamre

関連する問題