Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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
clojure环中的重复评估_Clojure_Ring - Fatal编程技术网

clojure环中的重复评估

clojure环中的重复评估,clojure,ring,Clojure,Ring,我正在学习Clojure戒指。这是我的第一个处理程序: (ns long-hdi.core (:gen-class)) (defn -main "I don't do a whole lot ... yet." [& args] (println "Hello, World!"){:body "hello" :status 200}) (defn on-init[](println "Initializing...")) (defn on-destroy[](print

我正在学习Clojure戒指。这是我的第一个处理程序:

(ns long-hdi.core
 (:gen-class))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (println "Hello, World!"){:body "hello" :status 200})

(defn on-init[](println "Initializing..."))
(defn on-destroy[](println "destroying..."))
这是project.clj配置文件:

   (defproject long-hdi "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]]
  :plugins [[lein-ring "0.9.7"]]
  :ring {:handler long-hdi.core/-main :init long-hdi.core/on-init :destroy long-hdi.core/on-destroy}
  :main ^:skip-aot long-hdi.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}})
当我跑步时: 莱因环无头服务器 并浏览至 我看到它在控制台上打印了两次“你好,世界!”。为什么要打印两次?我想它只能打印一次。 然后,我将源代码修改为:

...{:body args :status 200}...
然后使用谷歌浏览器浏览到 这一次,它在控制台上打印了3次“你好,世界!”。为什么改为打印3次


我使用的是REPL-y 0.3.7、nREPL 0.2.12、Clojure 1.8.0、lein ring“0.9.7”、Windows 10-64位。

问题不是因为您的代码而发生的,但我将在下面向您展示如何修改代码以获得所需的结果

要在此处进行更多调查,请打开Chrome开发工具窗口(右键单击并选择“检查”)。转到顶部的“网络”选项卡。在左侧,您将在请求列表下看到一些有趣的内容:
localhost
以及
favicon.ico
。因此,事实上,每次重新加载浏览器时,它不仅会对页面发出请求,还会对页面图标发出请求,这就是为什么会看到两个请求。Firefox(至少在我的例子中)只是在第一次加载后缓存图标,但chrome每次都从服务器请求它

那么,你能做些什么呢?浏览器的每个请求都调用相同的处理程序。所以,你需要下一步探索路线。这允许您将特定浏览器请求映射到特定处理程序。因此,您可以简单地避免调用以获取
favicon
。作为一个小的工作示例,您可以在浏览器窗口中看到请求,而不是打印到命令行:

您的project.clj:

(defproject long-hdi "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [ring/ring-core "1.5.1"]
                 [ring/ring-jetty-adapter "1.5.1"]
                 [compojure "1.5.2"]]
  :main long-hdi.core)
在主源文件中:

(ns long-hdi.core
  (:require [ring.adapter.jetty]
            [compojure.core :refer :all]))

(def counter (atom 0))

(defn handler
  [req]
  (swap! counter inc)
  {:body (str "counter is: " @counter) :status 200})

(defroutes app
  (GET "/" [] handler))

(defn -main [& args]
  (ring.adapter.jetty/run-jetty app {:port 3000}))
运行服务器,然后在
localhost:3000的浏览器窗口中将其打开:

$ lein run

我希望这有帮助,并且玩得开心

我想你应该在修改代码后调用
-main
,然后调用
你好,世界累积在你的控制台上。不,绝对不。我没有计算累积结果。每次刷新浏览器都会生成2个“你好,世界!”。
-main
是您的处理程序吗?您应该使用其他函数作为处理程序
-main
只能用作应用程序的入口点。是的,它是处理程序。我刚刚将
-main
重命名为
其他函数
。相同的结果。请编辑您的问题,并粘贴文件中的所有代码。谢谢!我没想到法维康。