Почему Reagent обрабатывает JSON тремя способами?

Я пытаюсь отобразить данные JSON из вызова API в Clojurescript/Reagent. Когда я использую js/alert, я вижу ожидаемый json: ["Sue" "Bob"]

(defn- call-api [endpoint]
  (go
    (let [response (<! (http/get endpoint))]
      (:names (:body response)))))

;; -------------------------
;; Views

(defn home-page []
  [:div (call-api "/api/names")])

Вот как я ссылаюсь на библиотеки (на случай, если там возникнут проблемы).

(ns myapp.core
    (:require [reagent.core :as reagent :refer [atom]]
              [reagent.session :as session]
              [cljs-http.client :as http]
              [cljs.core.async :refer [<! >!]]
              [secretary.core :as secretary :include-macros true]
              [accountant.core :as accountant])
    (:require-macros [cljs.core.async.macros :refer [go]]))

Но когда я вывожу его в консоль, я получаю длинный хеш, который совсем не похож на ответ API. Браузер отображает «00000000000120».

  • Почему эти результаты различаются? (браузер, окно предупреждения, консольное сообщение)
  • Как я могу получить то, что я вижу в окне предупреждения, для отображения на странице?

person jmargolisvt    schedule 08.02.2016    source источник


Ответы (1)


Когда вы вызываете call-api, он возвращает блок go. Вместо того, чтобы пытаться использовать этот блок непосредственно в вашей функции Reagent, вы могли бы вместо этого обновить возвращаемое значение в ratom.

(def app-state (atom)) ;; ratom

(defn- call-api [endpoint]
  (go
    (let [response (<! (http/get endpoint))]
      (reset! app-state (:names (:body response))))))

(defn home-page []
  [:div @app-state])

(defn main []
  (call-api))
person Daniel Compton    schedule 09.02.2016
comment
Спасибо, Даниэль. Не могли бы вы расширить Вам нужно будет ‹! по результату блока go куда-то? Вы имеете в виду >!? Фрагмент кода того, что должно быть в defn home-page, был бы очень полезен. :) - person jmargolisvt; 09.02.2016
comment
Я обновил свой ответ (непроверенным) фрагментом кода, который должен показать общую идею. - person Daniel Compton; 09.02.2016
comment
Огромный успех! Не уверен, почему он должен пройти через атом, но это продвинет меня вперед. Благодарю вас! - person jmargolisvt; 09.02.2016
comment
Присоединяйтесь к Clojurians Slack, канал #regent может объяснить рассуждения дальше :) - person Daniel Compton; 09.02.2016