gpt4 book ai didi

clojure - 是否可以使 Clojure 中内存函数的值无效?

转载 作者:行者123 更新时间:2023-12-02 17:47:49 25 4
gpt4 key购买 nike

我有一个函数可以发出 HTTP 请求来获取 token ,该 token 将在将来的请求中使用。该 token 的有效期未指定,可能是几个小时左右。

  (defn request-app-token
"Request an app token from FB. Useful for app-global actions, such as creating test users."
[client-credentials]
(-> {"client_id" (:client-id client-credentials)
"client_secret" (:client-secret client-credentials)
"grant_type" "client_credentials"}
(form-encode)
((partial str fb-graph-api "/oauth/access_token?"))
(client/get {:throw-entire-message? true})
:body
(json/read-str)
(get "access_token")))

对我来说,这看起来像是 memoize 的一项工作:保留 token 的副本并重复使用它,而不是每次需要时都请求新 token 。

  (def get-app-token (memoize request-app-token)) ; So beautiful :D

我只需要处理 token 过期的情况。为此,我将反转控制;获取需要 token 的函数,尝试使用内存的 token 运行它,如果失败,则使用新的 token 重试。

  (defn with-app-token [client-credentials f]
(try (f (get-app-token client-credentials))
(catch Exception e ; I know I should be more specific here, I only want to catch HTTP 400 responses
(f (request-app-token client-credentials)))))

这会起作用,但在第一个 token 过期后,对 with-app-token 的所有后续调用都将请求新 token 。我需要某种方法来清除或使 get-app-token 的内存返回值无效。

我可以编写自己的 memoize 函数,并使用一个 invalidate 函数来清除特定结果,但我想知道该语言中是否已经存在某种意思来处理这个?

最佳答案

clojure.core.memoize有我需要的:一个 memo-clear! 功能。在要求 [clojure.core.memoize :refer [memo memo-clear!]] 后,解决方案如下所示:

  (defn request-app-token
"Request an app token from FB. Useful for app-global actions, such as creating test users."
[client-credentials]
(-> {"client_id" (:client-id client-credentials)
"client_secret" (:client-secret client-credentials)
"grant_type" "client_credentials"}
(form-encode)
((partial str fb-graph-api "/oauth/access_token?"))
(client/get {:throw-entire-message? true})
:body
(json/read-str)
(get "access_token")))

(def get-app-token (memo request-app-token))

(defn with-app-token [client-credentials f]
(try (f (get-app-token client-credentials))
(catch Exception e ; I know I should be more specific here, I only want to catch HTTP 400 responses
(memo-clear! get-app-token client-credentials)
(f (get-app-token client-credentials)))))

关于clojure - 是否可以使 Clojure 中内存函数的值无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36088401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com