2012-03-27 3 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, пока оно не вернет значение, отличное от нуля, а затем выйдет из блока до тех пор, пока не будет выбран блок. Что я сделал не так? Большое спасибо!

+1

опрос не идея асинхронном ... – Reactormonk

+2

Почему 'до!' Вместо 'while'? –

+0

@ MichaelKohl Я должен быть пессимистом :) Тот же результат с 'while', хотя .. @ Tass согласился, в конечном итоге реорганизует это с уведомлениями – Kevsy

ответ

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

Спасибо Стиву, но не повезло - я установил «статус 204» в Sinatra, когда «access_token» не имеет назначенного значения и подтвердил, что «204» - это ответ Sinatra. Тем не менее только один запрос, хотя ... очень странный и ничего плохого в вашей логике! – Kevsy

+0

Теперь мы работаем с небольшой поправкой на код Стива: swap '@ access_token.code == 200' для'! @ Access_token.code.empty? 'И работает в моей реализации. Спасибо всем за советы! – Kevsy

0

Предполагая, что вы используете драгоценный камень для отдыха, 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 -block всегда выполняется только один раз, потому что RestClient#get всегда имеет возвращаемое значение или выдает ошибку. Чтобы помочь вам, мне нужно знать более подробную информацию о том, чего вы хотите достичь.

+0

Спасибо padde - но запрос не« сбой »как таковой, он выполняется с помощью HTTP 200 (OK), но нет тела ответа. – Kevsy

+1

, тогда попробуйте 'while @ access_token.empty?' Вместо вашего оператора 'until' –

+0

все еще не повезло с' while @ access_token.empty ?, но спасибо за предложение. – Kevsy

Смежные вопросы