0

我制作了用于通过 id 获取单个对象的服务端点 api,它按预期工作。我用 Postman 和处理函数对其进行了测试。我将 cljs-ajax 库用于异步客户端。当我得到响应时,我无法更改试剂原子的状态。这是代码:

(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

因此,如您所见,我根据需要将对象放在处理程序中,但是当我尝试重置原子时,什么也没有发生。这就是我认为的问题的核心。谢谢艾伦。

4

1 回答 1

3

如有疑问,请使用调试打印语句。让你的处理程序看起来像这样:

:handler (fn [arg]
           (println :handler-arg arg)
           (reset! business-partner (:business-partner arg)))

您可能还想使用clojure.pprint/pprint漂亮打印输出,或添加(type arg)到输出。

您可能还希望将 atom 初始化为特定值,例如 :bp-default,这样您就可以查看nil您观察到的是原始值还是重置为nil.


更新

因此很明显,:business-partner您收到的地图中不存在密钥。这是您必须调试的。

试图从地图中拉出一个不存在的键总是返回nil。您也可以使用 3-arg 版本get来明确这一点。兑换

(:business-partner arg)  =>  (get arg :business-partner ::not-found)

你会看到关键字::not-found出现在你的原子中,验证正在发生的事情。

为了尽早发现这些问题,我几乎总是使用Tupelo 库中的grab一个简单函数,如下所示:

(:business-partner arg)  =>  (grab :business-partner arg)

如果未找到预期的键,该grab函数将抛出异常。这提供了问题的早期预警,因此您可以更快地追踪它们。

另一个提示:下次使用prn而不是,println它将在字符串输出中保留双引号,例如:

"Main Street"
于 2020-03-25T15:11:31.753 回答