gpt4 book ai didi

clojurescript - 使用 Klipse 和 Reagent 的 clojurescript 中的时间间隔非常(太)快

转载 作者:行者123 更新时间:2023-12-02 01:02:53 29 4
gpt4 key购买 nike

您好,我正在尝试 ClojureScript,我正在使用 Klipse作为我的 REPL 差不多。这可能不是它的预期用途,但因为我没有做任何太复杂的事情,所以现在没问题。

我遇到的一个问题是尝试设置计时器。我的代码是:

(ns my.reagent-examples
(:require [reagent.core :as r]))

(when-let [element (js/document.getElementById "app")]
(r/render-component [component] element))

;; State
(def app-state (r/atom 0)) ;; Initial value is 0

;; Increment seconds
(js/setInterval #(swap! app-state inc) 1000) ;; Increment app-state every 1000ms

;; "Seconds elapsed" component
(defn timer []
[:div (str "Seconds elapsed: " @app-state)])

它显示了一个计时器,但它太快了,而且似乎随着时间的流逝而加速。预期结果是计数器每秒递增。

我完整的 Klipse 文件是这样的:

<!DOCTYPE html>

<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="https://storage.googleapis.com/app.klipse.tech/css/codemirror.css">
<script>
window.klipse_settings = {
selector: '.language-klipse', // css selector for the html elements you want to klipsify
selector_reagent: '.language-reagent', // selector for reagent snippets
};
</script>
</head>

<body>

<pre><code class="language-reagent">
(ns my.reagent-examples
(:require [reagent.core :as r]))
(when-let [element (js/document.getElementById "app")]
(r/render-component [component] element))
;; State
(def app-state (r/atom 0)) ;; Initial value is 0
;; Increment seconds
(js/setInterval #(swap! app-state inc) 1000) ;; Increment app-state every 1000ms
;; "Seconds elapsed" component
(defn timer []
[:div (str "Seconds elapsed: " @app-state)])
</code></pre>

<script src="https://storage.googleapis.com/app.klipse.tech/plugin/js/klipse_plugin.js"></script>
</body>

(在整个页面中运行代码片段以查看计时器)

编辑:我看起来像个傻瓜,因为在代码片段中计时器看起来正常运行,但是当我使用 Google Chrome 或 Firefox 打开完全相同的 HTML 文件时,计时器变得疯狂......这可能是什么原因?

EDIT2:似乎如果您更改代码段上的内容,您会看到计时器走得更快,那是因为它渲染的时间太多了吗?

最佳答案

问题可能是当您编辑和保存代码时,它会在您的浏览器中热重新加载并启动另一个 js/setInterval 而不会停止前一个。

您可以通过在 defonce 定义中调用 js/setInterval 来修复它,它只会在第一次加载时执行一次,并且不会在重新加载时调用:

(defonce timer-increment-interval
(js/setInterval #(swap! app-state inc) 1000)) ;; Increment app-state every 1000ms

关于clojurescript - 使用 Klipse 和 Reagent 的 clojurescript 中的时间间隔非常(太)快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49329666/

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