2012-04-25 92 views
4

我想每10秒迭代一次JSON-API,並且如果在JSON數據中找到某個鍵​​,則使用相同的連接(keepalive)執行第二個HTTP請求。如果我沒有在我的代碼中放置EM.stop,則在完成req1.callback中的處理後,程序停止等待。em-http-request - 我在哪裏放置EventMachine.stop?

如果我把EM.stop放在req2.callback裏面,它的工作原理和迭代方式和預期的一樣。

但是,如果JSON文檔沒有包含密鑰foobar,程序會在req1.callback中完成處理後停止等待。

如果我在req1.callback的最後一行中添加EM.stop,如果JSON文檔的密鑰爲foobar,則會中止req2.callback。

如果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 

回答

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 2012-04-25 20:24:11

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 2012-04-25 14:16:18

+0

我已更新我的回答 – fl00r 2012-04-25 14:58:06

+0

謝謝!我會在接受最適合的答案之前嘗試這一點。 – pkhamre 2012-04-25 20:07:06