复位功能后试剂原子值仍然为零

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"