4

例えば:

(: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)

「some-url」がダウンしている場合、タイムアウト時に「post-callback」が呼び出されます。しかし、コールバック関数内で、タイムアウトのために呼び出されたかどうかを確認する方法。そうする方法があれば教えてください。ありがとう。

4

1 に答える 1

3

これは、タイムアウトを簡単に再現する方法です:

(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 フィールドは nil ではなく、タイムアウトの場合は TimeoutException が含まれます。ところで、これはクライアントのドキュメントからわずかに変更された例です-そこでうまく説明されていると思います。

コールバックを次のように変更してみてください。

(defn post-callback
  [{:keys [status headers body error]}]
  ;; and check the error same way as I do above
)
于 2015-08-27T07:30:18.873 に答える