我正在开发一个Clojure应用程序,该应用程序将与Web API交互以返回符合特定条件的随机结果。由于API的限制,我必须检索大量结果并使用Clojure过滤掉适当的结果。
我会说99%或更多的时间,第一次请求的结果中至少有一个符合我的标准。但由于其他1%,我觉得我必须构建功能来发出多个请求。显然,第二个请求成功的可能性非常大,但我对于编写一个无休止地重复的函数,直到它得到正确的结果以防万一出错并最终DDoSing API。
我的第一个想法是在函数中构建一个计数器,并将其限制为五个请求。但作为一种方法,这感觉有点程序化。什么是惯用的Clojure方式呢?
这是我到目前为止所拥有的:
(ns randchar.api
(:require [clj-http.client :as client]))
(defn api-request
[url]
(get-in
(client/request
{:url url
:method :get
:content-type :json
:as :json}) [:body :results]))
(defn filter-results
"Returns the first result that meets the criterion."
[results criterion]
(take 1
(filter #(= (get-in % [:nested :sub-nested]) criterion) results)))
(defn build-url
"Returns a url with randomized query string for the api request; not shown."
[]
)
(defn return-result
"Currently recurs endlessly if no results meet the criterion."
[criterion]
(let [x (filter-results (api-request (build-url)) criterion)]
(if (not (empty? x))
x
(recur))))
答案 0 :(得分:3)
您可以尝试以下内容:
(defn return-result
[criterion count]
(->> (repeatedly count #(filter-results (api-request build-url) criterion))
(filter (complement empty?))
first))