Как определить, что обратный вызов клиента http-kit вызывается из-за тайм-аута?

Например:

(:require [org.httpkit.client :as http])

(defn post-callback
 []
 ;; how to know if it is due to timeout?
 )

(def options {:body "abc" :timeout 1000})
(http/post "some-url" options post-callback)

Если «какой-то URL-адрес» не работает, то по тайм-ауту вызывается «пост-обратный вызов». Но в функции обратного вызова, как узнать, вызывается ли она из-за тайм-аута. Пожалуйста, дайте мне знать, если есть способ сделать это. Спасибо.


person Murugan Sundararaj    schedule 27.08.2015    source источник


Ответы (1)


Вот как вы можете легко воспроизвести timeout :

(http/get "http://google.com" {:timeout 1}
         (fn [{:keys [status headers body error]}] ;; asynchronous response handling
           (if error
             (do
               (if (instance? org.httpkit.client.TimeoutException error)
                 (println "There was timeout")
                 (println "There wasn't timeout"))
               (println "Failed, exception is " error))
             (println "Async HTTP GET: " status))))

Он напечатает ошибку, которая является экземпляром org.httpkit.client.TimeoutException.

Поэтому вам нужно изменить свой обратный вызов, чтобы принять карту. В случае ошибки поле :error в этой карте не равно нулю, а в случае тайм-аута оно будет содержать TimeoutException. Кстати, это всего лишь слегка измененный пример из документации клиента - я думаю, это хорошо объяснено в там.

Поэтому попробуйте изменить свой обратный вызов на:

(defn post-callback
  [{:keys [status headers body error]}]
  ;; and check the error same way as I do above
)
person Viktor K.    schedule 27.08.2015