2012-03-27 198 views
0

我試圖以確保變量的值,然後再繼續非零 - 值異步實例化取決於請求活動在西納特拉實例爲什麼測試失敗時這個Ruby代碼會執行?

attr_accessor :access_token 

until [email protected]_token.nil? 
    @access_token = RestClient.get @callback_URI + '/access_token/' + @request_Id 
end 

puts @access_token #=> always get output even if @access_token is nil 

我的理解是表達的意思是:「保持分配RestClient調用@access_token的值直到它返回一個非零值,然後退出until塊'。我做錯了什麼?非常感謝!

+1

輪詢不是異步的想法... – Reactormonk 2012-03-27 11:40:55

+2

爲什麼'直到!'而不是'while'? – 2012-03-27 11:48:38

+0

@MichaelKohl @MichaelKohl我一定是一個悲觀主義者:)同樣的結果,儘管'while雖然.. @塔斯同意,最終將重構這與通知 – Kevsy 2012-03-27 13:34:49

回答

1

我不知道你的服務器的回報,但我會嘗試像,

while true 
    begin 
     @access_token = RestClient.get @callback_URI + '/access_token/' + @request_Id 
     break if @access_token.code == 200 
    rescue 
     $stderr.puts "failed to get access token" 
    end 
    sleep 1 
end 
+0

感謝史蒂夫,但沒有運氣 - 我已經在Sinatra設置了'204狀態',因爲'access_token'沒有賦值,並且確認'204'是Sinatra發送的響應。儘管如此,仍然只有一個請求......非常奇怪,並且沒有任何錯誤! – Kevsy 2012-03-27 14:42:55

+0

現在正在對Steeve的代碼進行小修改:將'@ access_token.code == 200'交換爲'!@ access_token.code.empty?',它在我的實現中起作用。感謝大家的建議! – Kevsy 2012-03-27 16:21:31

0

假設您正在使用剩餘客戶端gem,RestClient不會在失敗的請求上返回nil。例如:

require 'rest_client' 
puts RestClient.get "http://invalidurl.foo/somepath" 

從我的供應商(不nil)產生一個錯誤頁:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> 
<html> 
<head> 
    <title>T-Online Navigationshilfe</title> 
</head> 
<frameset rows="100%"> 
<frame src="http://navigationshilfe.t-online.de/dnserror?url=http://invalidurl.foo/" 
    frameborder="0" noresize="noresize"/> 
<noframes> 
    <body> 
    <h1>Willkommen bei T-Online</h1> 
    <p> 
    <a href="http://navigationshilfe.t-online.de/dnserror?url=http://invalidurl.foo/"> 
    weiter....</a> 
    </p> 
    </body> 
</noframes> 
</frameset> 
</html> 

沒有這個代碼產生的錯誤信息的互聯網連接:

http.rb:762:in `initialize': getaddrinfo: nodename nor servname provided, or not known (SocketError) 

這意味着,你的until - 塊總是隻執行一次,因爲RestClient#get總是有返回值或拋出錯誤。爲了幫助你,我需要了解你想要完成的更多細節。

+0

感謝padde - 但請求不'失敗',因此,它滿足了一個HTTP 200響應(確定)但沒有響應主體。 – Kevsy 2012-03-27 13:31:05

+1

然後嘗試'while @ access_token.empty?',而不是'直到'語句 – 2012-03-27 13:37:58

+0

'while while access_token.empty?'仍然沒有運氣,但感謝您的建議。 – Kevsy 2012-03-27 14:39:51

相關問題