Clojurescript+Om:等待状态更改,然后做一些事情
我正在尝试制作一个Clojurescript应用程序来显示食谱 相关代码如下: 我想要完成的是: 首先使用异步http调用获取配方。我正在使用返回通道的cljs-http.client 使用秘书库定义路线。在/random路径中,我想选择一个随机配方。只有在应用程序atom中获取并更新数据时,才会发生这种情况。 我现在得到的是浏览器中的无限循环。发生了什么事 另一种选择是包装所有需要先在go块中获取数据并放在第一行的路由 附言:我的结局是Clojurescript+Om:等待状态更改,然后做一些事情,clojure,clojurescript,core.async,om,secretary,Clojure,Clojurescript,Core.async,Om,Secretary,我正在尝试制作一个Clojurescript应用程序来显示食谱 相关代码如下: 我想要完成的是: 首先使用异步http调用获取配方。我正在使用返回通道的cljs-http.client 使用秘书库定义路线。在/random路径中,我想选择一个随机配方。只有在应用程序atom中获取并更新数据时,才会发生这种情况。 我现在得到的是浏览器中的无限循环。发生了什么事 另一种选择是包装所有需要先在go块中获取数据并放在第一行的路由 附言:我的结局是 (defn ensure-recipes-loaded
(defn ensure-recipes-loaded [data]
(go (if (not (:loaded? (om/value data)))
(do (om/update! data :view :loading)
(let [recipes-data (<! (fetch-recipes data))]
(om/update! data :recipes recipes-data)
(om/update! data :loaded? true)))
(println "Data already loaded"))))
(defn define-routes [data]
(defroute home-path "/" []
(om/update! data :view :home))
(defroute "/random" []
(go
(<! (ensure-recipes-loaded data))
(do (om/update! data :tag
(rand-nth
(vec (apply set/union (map :tags (:recipes @data))))))
(om/update! data :view :random))))
(defroute "/random/:tagname" [tagname]
(go (<! (ensure-recipes-loaded data))
(om/update! data :tag tagname)
(om/update! data :view :random)))
(defroute "/recipe/:link" [link]
(go (<! (ensure-recipes-loaded data))
(om/update! data :view :recipe)
(om/update! data :permalink link)))
(defroute "*" [*]
(go (<! (ensure-recipes-loaded data))
(om/update! data :view :default))))
使用循环构造而不在其内部执行任何驻车通道操作来等待,这与core.async的精神完全相反。请记住,JavaScript是单线程的,所以如果您不停止执行线程,就没有机会运行任何其他线程
有一个通道,当加载操作完成时关闭。当你需要封锁时,试着从那个频道读;如果它返回nil,它就完成了,如果它阻塞了,那么您就有了所需的等待操作。如果您想在等待期间定期执行某些操作,请同时从该频道和超时中读取。谢谢,这很有意义。我发布了我的更新代码。请评论是否可以改进。
(defn ensure-recipes-loaded [data]
(go (if (not (:loaded? (om/value data)))
(do (om/update! data :view :loading)
(let [recipes-data (<! (fetch-recipes data))]
(om/update! data :recipes recipes-data)
(om/update! data :loaded? true)))
(println "Data already loaded"))))
(defn define-routes [data]
(defroute home-path "/" []
(om/update! data :view :home))
(defroute "/random" []
(go
(<! (ensure-recipes-loaded data))
(do (om/update! data :tag
(rand-nth
(vec (apply set/union (map :tags (:recipes @data))))))
(om/update! data :view :random))))
(defroute "/random/:tagname" [tagname]
(go (<! (ensure-recipes-loaded data))
(om/update! data :tag tagname)
(om/update! data :view :random)))
(defroute "/recipe/:link" [link]
(go (<! (ensure-recipes-loaded data))
(om/update! data :view :recipe)
(om/update! data :permalink link)))
(defroute "*" [*]
(go (<! (ensure-recipes-loaded data))
(om/update! data :view :default))))