\$\begingroup\$
\$\endgroup\$
I want to keep trying to get response until its code is 200 or unknown yet. In first case it should be stored in response
variable. In another case I should raise any kind of exception.
response = nil
1.times do
response = begin
http.request request
rescue Net::ReadTimeout
puts "Net::ReadTimeout"
retry
end
case response.code
when "503"
puts "servers are busy at #{Time.now}?"
sleep 5
redo
when "200"
"ok"
else
fail "#{response.code} at '#{request.path}'"
end
end
The 1.times
thing is taken from SO.
asked Jun 15, 2015 at 22:34
1 Answer 1
\$\begingroup\$
\$\endgroup\$
4
The 1.times ... redo
thing is just awful. Replace that with an until
loop, like this:
success = false
until success
...
case response.code
...
when "200"
success = true
"ok"
else
...
end
end
answered Jun 16, 2015 at 0:03
-
\$\begingroup\$ Too imperative. \$\endgroup\$Nakilon– Nakilon2015年06月16日 01:38:56 +00:00Commented Jun 16, 2015 at 1:38
-
2\$\begingroup\$ Ok, you didn't say anything about needing a functional pattern in your question. And besides, your original is already imperative. What exactly are you looking for? \$\endgroup\$Devon Parsons– Devon Parsons2015年06月16日 01:49:50 +00:00Commented Jun 16, 2015 at 1:49
-
\$\begingroup\$ Yes, original is imperative -- this is why I posted it to ask how to make it more Rubyish. \$\endgroup\$Nakilon– Nakilon2015年06月16日 04:22:14 +00:00Commented Jun 16, 2015 at 4:22
-
4\$\begingroup\$ There's nothing inherently 'un-Ruby' about imperative solutions. \$\endgroup\$Devon Parsons– Devon Parsons2015年06月16日 13:18:45 +00:00Commented Jun 16, 2015 at 13:18
lang-rb