Значение атома реагента остается нулевым после функции сброса

Я сделал API конечной точки сервиса для получения одного объекта по идентификатору, и он работает как положено. Я проверил это с почтальоном и в функции обработчика. Я использую библиотеку 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

Итак, как вы можете видеть, у меня есть объект в обработчике по желанию, но когда я пытаюсь сбросить свой атом, ничего не происходит. Это ядро ​​проблемы, я думаю. Спасибо Алан.

Всего 1 ответ


В случае сомнений используйте отладочные операторы печати. Сделайте так, чтобы ваш обработчик выглядел так:

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

Вы также можете использовать clojure.pprint/pprint чтобы красиво распечатать вывод, или также добавить (type arg) к выводу.

Вы также можете инициализировать атом с определенным значением, таким как :bp-default чтобы вы могли видеть, является ли наблюдаемый вами nil оригинальным или сбрасывается в nil .


Обновить

Таким образом, ясен ключ :business-partner не существует на карте, которую вы получаете. Это то, что вы должны отладить.

Попытка вытащить несуществующий ключ из карты всегда возвращает nil . Вы также можете использовать 3-аргументную версию get чтобы сделать это явным. Перерабатывать

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

и вы увидите, что ключевое слово ::not-found появляется в вашем атоме, проверяя, что происходит.

Для раннего выявления этих проблем я почти всегда использую простой набор функций из библиотеки Tupelo, например:

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

Функция grab выдаст исключение, если ожидаемый ключ не найден. Это обеспечивает раннее предупреждение о проблемах, чтобы вы могли быстрее их отследить.

Еще один совет: в следующий раз используйте prn вместо println и он будет сохранять двойные кавычки при выводе строки, например:

"Main Street"

Есть идеи?

10000