我正在尝试确保变量值在继续之前是非零的 - 根据Sinatra实例的请求活动异步实例化该值
attr_accessor :access_token
until !@access_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,直到它返回非nil值,然后退出until块'。我做错了什么?非常感谢!
答案 0 :(得分: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
答案 1 :(得分:0)
假设您使用的是rest-client 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
始终具有返回值或抛出错误。为了帮助您,我需要了解您想要完成的更多细节。