gpt4 book ai didi

clojure - Clojure 环中的重复评估

转载 作者:行者123 更新时间:2023-12-02 20:49:06 25 4
gpt4 key购买 nike

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

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

当我运行时:lein Ring headless 服务器并浏览至 http://localhost:3000我看到它在控制台上打印“Hello, world!”两次。为什么打印了2次?我想它只会打印一次。然后我将源代码修改为:

...{:body args :status 200}...

然后使用 Google Chrome 浏览至 http://localhost:3000这次,它打印出“Hello, world!”在控制台上 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。作为一个帮助您入门的小工作示例,它可以让您在浏览器窗口中看到请求的工作情况,而不是打印到命令行:

您的项目.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

希望这对您有所帮助,祝您玩得开心!

关于clojure - Clojure 环中的重复评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42966419/

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