Apo*_*dze 5 clojure clojurescript reagent re-frame
我按照这个例子:https : //github.com/Day8/re-frame/blob/master/docs/FAQs/PollADatabaseEvery60.md
这是我的间隔处理程序
(defonce interval-handler
(fn [{:keys [action id frequency event]}]
(let [live-intervals (atom {})]
(condp = action
:start (swap! live-intervals assoc id (js/setInterval #(re-frame/dispatch event) frequency))
:end (do (js/clearInterval (get live-intervals id))
(swap! live-intervals dissoc id))))))
(re-frame/reg-fx
:interval
interval-handler)
Run Code Online (Sandbox Code Playgroud)
我正在尝试从此处的另一个事件发送此间隔事件:
(re-frame/reg-event-db
:start-playing
(fn [db _]
(re-frame/dispatch [:interval {:action :start
:id :some-awesome-id
:frequency 1000
:event [:tick]}])
(assoc db :is-playing? true
:fake (random-active-color db)
:real (random-active-color db))))
Run Code Online (Sandbox Code Playgroud)
但它说 re-frame: no :event handler registered for: :interval
这是不可能的吗?
:interval是一个效果,而不是一个事件。要调用效果,您需要将其作为键包含在事件处理程序返回的效果图中 - 不要使用效果的键发出另一个事件:
(re-frame/reg-event-fx
:start-playing
(fn [{:keys [db]} _]
{:interval {:action :start
:id :some-awesome-id
:event [:tick]}]
:db (assoc db :is-playing? true
:fake (random-active-color db)
:real (random-active-color db))}))
Run Code Online (Sandbox Code Playgroud)
上面的事件处理程序将返回一个描述两种效果的地图:
:db- 将应用程序数据库更新为新值(作为:db值提供)
:interval- re-frame 将使用效果图中interval-handler的:intervalentry值调用您的效果处理程序 ( )