gpt4 book ai didi

asynchronous - 如何使用 Om + Figwheel + core.async 编写可重新加载的异步代码?

转载 作者:行者123 更新时间:2023-12-03 13:48:18 24 4
gpt4 key购买 nike

我想写一个类似时钟应用程序的东西。状态基本上是一个重复递增的数字。这里可以看到一种实现方法。

(ns chest-example.core
(:require [om.core :as om :include-macros true]
[om.dom :as dom :include-macros true]
[cljs.core.async :as async])
(:require-macros [cljs.core.async.macros :refer [go]]))

(defonce app-state (atom {:time 0}))

(defn clock-view [data owner]
(reify
om/IRender
(render [_]
(dom/div nil (pr-str data)))))

(go (while true
(async/<! (async/timeout 1000))
(om/transact! (om/root-cursor app-state) :time inc)))

(defn main []
(om/root
clock-view
app-state
{ :target (. js/document (getElementById "clock"))}))

我遇到的问题是这不是可重新加载的代码。一旦我通过无花果轮刷新代码,增量就会变得更快,因为有几件事会更新状态。

我尝试尝试各种想法(基本上是制作不同的组件来拥有 go 语句代码),但我无法想出可行的方法。

有人对此有一个简洁的解决方案吗?还是我只需要在开发过程中坚持使用它?

最佳答案

你必须告诉 goroutine 何时停止运行。最简单的方法是发送 close! 来告诉 goroutine:

(ns myproject.core
;; imports
)

(def my-goroutine
(go-loop []
(when (async/<! (async/timeout 1000))
(om/transact! (om/root-cursor app-state) :time inc)
(recur)))))

;; put in your on-reload function for figwheel
(defn on-reload []
(async/close! my-goroutine))

任何在循环中运行的 goroutine 都需要在重新加载时发出停止信号(通过 Figwheel 的 :on-jsload 配置)。

;; project.clj
(defproject ;; ...
:figwheel {:on-jsload "myproject.core/on-reload"}
)

最好将长时间运行的 goroutine 视为需要管理的资源。在 golang 中,将长时间运行的 goroutine 视为进程/墓碑以确保正确拆卸是一种常见的模式。同样的情况也适用于 core.async 的 goroutine。

关于asynchronous - 如何使用 Om + Figwheel + core.async 编写可重新加载的异步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30269754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com