Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojurescript+Om:等待状态更改,然后做一些事情_Clojure_Clojurescript_Core.async_Om_Secretary - Fatal编程技术网

Clojurescript+Om:等待状态更改,然后做一些事情

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

我正在尝试制作一个Clojurescript应用程序来显示食谱

相关代码如下:

我想要完成的是:

首先使用异步http调用获取配方。我正在使用返回通道的cljs-http.client 使用秘书库定义路线。在/random路径中,我想选择一个随机配方。只有在应用程序atom中获取并更新数据时,才会发生这种情况。 我现在得到的是浏览器中的无限循环。发生了什么事

另一种选择是包装所有需要先在go块中获取数据并放在第一行的路由

附言:我的结局是

(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))))