3

我正在开发一个 Clojure 应用程序,该应用程序将与 Web API 交互以返回满足特定标准的随机结果。由于 API 的限制,我必须检索一些结果并使用 Clojure 过滤出一个合适的结果。

我会说 99% 或更多的时间,第一个请求的至少一个结果将符合我的标准。但是因为那另外 1%,我觉得我必须构建功能来发出多个请求。显然,第二个请求成功的可能性非常大,但我对编写一个无限重复的函数持怀疑态度,直到它得到正确的结果,以防万一出现问题并且我最终对 API 进行 DDoSing。

我的第一个想法是在函数中构建一个计数器并将其限制为例如五个请求。但作为一种方法,这感觉有点程序化。解决此问题的惯用 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))))
4

1 回答 1

3

您可以尝试以下方法:

(defn return-result
  [criterion count]
  (->> (repeatedly count #(filter-results (api-request build-url) criterion))
       (filter (complement empty?))
       first))
于 2013-09-04T11:03:57.953 回答