复位功能后试剂原子值仍然为零
Reagent atom value is stil nil after reset function
我制作了服务端点 api 以通过 ID 获取单个对象,它按预期工作。我用 Postman 和处理函数对其进行了测试。我将 cljs-ajax 库用于异步客户端。当我得到响应时,我不能改变 Reagent atom 的状态。这是代码:
(ns businesspartners.core
(:require [reagent.core :as r]
[ajax.core :refer [GET POST]]
[clojure.string :as string]))
(def business-partner (r/atom nil))
(defn get-partner-by-id [id]
(GET "/api/get-partner-by-id"
{:headers {"Accept" "application/transit+json"}
:params {:id id}
:handler #(reset! business-partner (:business-partner %))}))
当我尝试访问业务合作伙伴原子时,我得到了该原子的零值。我不明白为什么,因为另一种方法几乎相同,除了它获取业务合作伙伴列表并且工作正常。
当我更改 get-partner-by-id 函数时:
(defn get-partner-by-id [id]
(GET "/api/get-partner-by-id"
{:headers {"Accept" "application/transit+json"}
:params {:id id}
:handler (fn [arg]
(println :handler-arg arg)
(reset! business-partner (:business-partner arg))
(println "Business partner from handler: " @business-partner))}))
浏览器控制台输出:
:handler-arg {:_id 5e7ad2c84b5c2d44583e8ecd,
:address Main Street,
:email nenmit@gmail.com,
:phone 555888,
:name Nen Mit}
Business partner from handler: nil
因此,如您所见,我根据需要在处理程序中放置了我的对象,但是当我尝试重置我的原子时,没有任何反应。我认为这就是问题的核心。谢谢艾伦。
如有疑问,请使用调试打印语句。让你的处理程序看起来像这样:
:handler (fn [arg]
(println :handler-arg arg)
(reset! business-partner (:business-partner arg)))
您可能还想使用 clojure.pprint/pprint
来漂亮地打印输出,或者也将 (type arg)
添加到输出中。
您可能还想将原子初始化为特定值,例如
:bp-default
这样您就可以查看您观察到的 nil
是原始的还是正在重置为 nil
。
更新
很明显密钥 :business-partner
在您收到的地图中不存在。这是你必须调试的。
总是试图从地图中拉出一个不存在的键 returns nil
。您还可以使用 get
的 3-arg 版本来明确这一点。转换
(:business-partner arg) => (get arg :business-partner ::not-found)
你会看到关键字 ::not-found
出现在你的原子中,验证正在发生的事情。
为了及早发现这些问题,我几乎总是使用 the Tupelo library 中的一个简单函数 grab
,如下所示:
(:business-partner arg) => (grab :business-partner arg)
如果找不到预期的键,grab
函数将抛出异常。这提供了问题的早期预警,因此您可以更快地找到它们。
另一个提示:下次使用 prn
而不是 println
它将在字符串输出中保留双引号,例如:
"Main Street"
我制作了服务端点 api 以通过 ID 获取单个对象,它按预期工作。我用 Postman 和处理函数对其进行了测试。我将 cljs-ajax 库用于异步客户端。当我得到响应时,我不能改变 Reagent atom 的状态。这是代码:
(ns businesspartners.core
(:require [reagent.core :as r]
[ajax.core :refer [GET POST]]
[clojure.string :as string]))
(def business-partner (r/atom nil))
(defn get-partner-by-id [id]
(GET "/api/get-partner-by-id"
{:headers {"Accept" "application/transit+json"}
:params {:id id}
:handler #(reset! business-partner (:business-partner %))}))
当我尝试访问业务合作伙伴原子时,我得到了该原子的零值。我不明白为什么,因为另一种方法几乎相同,除了它获取业务合作伙伴列表并且工作正常。
当我更改 get-partner-by-id 函数时:
(defn get-partner-by-id [id]
(GET "/api/get-partner-by-id"
{:headers {"Accept" "application/transit+json"}
:params {:id id}
:handler (fn [arg]
(println :handler-arg arg)
(reset! business-partner (:business-partner arg))
(println "Business partner from handler: " @business-partner))}))
浏览器控制台输出:
:handler-arg {:_id 5e7ad2c84b5c2d44583e8ecd,
:address Main Street,
:email nenmit@gmail.com,
:phone 555888,
:name Nen Mit}
Business partner from handler: nil
因此,如您所见,我根据需要在处理程序中放置了我的对象,但是当我尝试重置我的原子时,没有任何反应。我认为这就是问题的核心。谢谢艾伦。
如有疑问,请使用调试打印语句。让你的处理程序看起来像这样:
:handler (fn [arg]
(println :handler-arg arg)
(reset! business-partner (:business-partner arg)))
您可能还想使用 clojure.pprint/pprint
来漂亮地打印输出,或者也将 (type arg)
添加到输出中。
您可能还想将原子初始化为特定值,例如
:bp-default
这样您就可以查看您观察到的 nil
是原始的还是正在重置为 nil
。
更新
很明显密钥 :business-partner
在您收到的地图中不存在。这是你必须调试的。
总是试图从地图中拉出一个不存在的键 returns nil
。您还可以使用 get
的 3-arg 版本来明确这一点。转换
(:business-partner arg) => (get arg :business-partner ::not-found)
你会看到关键字 ::not-found
出现在你的原子中,验证正在发生的事情。
为了及早发现这些问题,我几乎总是使用 the Tupelo library 中的一个简单函数 grab
,如下所示:
(:business-partner arg) => (grab :business-partner arg)
如果找不到预期的键,grab
函数将抛出异常。这提供了问题的早期预警,因此您可以更快地找到它们。
另一个提示:下次使用 prn
而不是 println
它将在字符串输出中保留双引号,例如:
"Main Street"