Как рендерить компоненты dom в реагенте асинхронно?

Я делаю http-запрос и пытаюсь поместить возвращенный val в компонент-реагент следующим образом:

[div
    (a/take! (http/get "http://localhost:5000/data"))
             #(into [:div]
                     (map render-method
                          (into [] (map (fn [res] (:name res)) (-> % :body :results))))

                     )
                )
]

Но это по понятным причинам не работает, потому что a/take! сам не возвращает компонент. Так как же заставить асинхронный запрос на получение работать с реагентом?


person zengod    schedule 29.02.2020    source источник


Ответы (1)


Вы не можете этого сделать. Вместо этого вам нужно сохранить результат в атоме, и реагент будет перерендерен для вас после его загрузки.

(def data (reagent/atom nil))

(defn fetch-data []
  (take! (http/get "http://localhost:5000/data") #(reset! data %)))

(defn names-list []
  [:div
   (doall (map :name @data))])

(defn my-component []
  [:div
   (if @data
     [names-list]
     [:div "loading"])])
person Walton Hoops    schedule 01.03.2020