Я пользуюсь a gem, чтобы получить код результата от Ideone.com. Жемчуг отправляет код в Ideone, а затем проверяет страницу результатов. Он проверяет timeout
раз, а затем отказывается, если результата нет. Проблема в том, что он может сдаться слишком рано, но я также не хочу, чтобы он слишком долго ждал, если не будет результата. Есть ли способ узнать, когда нужно отказаться от надежды?Когда отказаться от получения результатов от внешнего веб-сервиса?
Это соответствующий код:
begin
sleep 3 if i > 0
res = JSON.load(
Net::HTTP.post_form(
URI.parse("http://ideone.com/ideone/Index/view/id/#{loc}/ajax/1"),
{}
).body
)
i += 1
end while res['status'] != '0' && i < timeout
if i == timeout
raise IdeoneError, "Timed out while waiting for code result."
end
Спасибо. Я уже разветвил камень, чтобы заставить его работать. Так что, я думаю, я должен просто снизить задержку и поднять попытки? Мне было интересно, есть ли лучший способ узнать, когда отказаться. – Ari
Я не думаю, что имеет смысл повторять чаще, чем раз в 3 секунды. Я бы даже увеличил его. Только вы можете решить, как долго вы можете ждать результата. Этот код является синхронным и блокируется до указанного таймаута. Если вы запустите этот код из рубинового скрипта из некоторой фоновой задачи - вы можете долго ждать. Как 3-5 минут. Но если код выполняется как часть обработки реальных HTTP-запросов пользователя, вы обычно не хотите ждать вообще. Даже 1 секунда слишком много. Поэтому правильно выполнить некоторую асинхронную проверку с помощью push-сервера или ajax long-poll. – cryo28
его запрос ajax, но пользователь будет ждать результата. в идеале я хотел бы дать его им в течение нескольких секунд, но лучше опоздать, чем дать «тайм-аут ошибки». не знаю лучшего способа избежать ошибки. – Ari