首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >克洛法里奥兹/视图!不连接浏览器

克洛法里奥兹/视图!不连接浏览器
EN

Stack Overflow用户
提问于 2021-04-14 21:47:45
回答 2查看 135关注 0票数 2

我试图在Clojure中做一些(简单的)图解,看起来奥兹将是一个很好的长期解决方案。但是,我遇到了一些问题,只是想让示例代码运行。我对ClojureScript /试剂/ Hiccup完全陌生.

在该网站上,它显示了以下示例代码:

代码语言:javascript
复制
(defn play-data [& names]
  (for [n names
        i (range 20)]
    {:time i :item n :quantity (+ (Math/pow (* i (count n)) 0.8) (rand-int (count n)))}))

(def line-plot
  {:data {:values (play-data "monkey" "slipper" "broom")}
   :encoding {:x {:field "time" :type "quantitative"}
              :y {:field "quantity" :type "quantitative"}
              :color {:field "item" :type "nominal"}}
   :mark "line"})

;; Render the plot
(oz/view! line-plot)

对我来说,(oz/view! ...)在我的浏览器中创建了一个空白页面,但实际上没有输出任何情节。谁能帮我弄清楚这是怎么回事?我是如何检查Oz是否直接连接到浏览器的?Oz是如何确定使用哪个浏览器的(我目前正在使用Brave)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-14 22:24:20

尝试如下所示,它使用我最喜欢的模板项目

代码语言:javascript
复制
(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require
    [oz.core :as oz]
    ))

(defn play-data [& names]
  (for [n names
        i (range 20)]
    {:time i :item n :quantity (+ (Math/pow (* i (count n)) 0.8) (rand-int (count n)))}))

(defn line-plot []
  {:data     {:values (play-data "monkey" "slipper" "broom")}
   :encoding {:x     {:field "time" :type "quantitative"}
              :y     {:field "quantity" :type "quantitative"}
              :color {:field "item" :type "nominal"}}
   :mark     "line"})

(dotest
  ; Render the plot
  (println \newline "calling (oz/start-server!)")
  (oz/start-server!) ; this is optional and is implied by oz/view!

  (println \newline "calling (oz/view! (line-plot))")
  (oz/view! (line-plot))

  (println \newline "sleeping")
  (Thread/sleep 5000)
)

其结果是:

代码语言:javascript
复制
 calling (oz/start-server!)
21-04-14 22:21:15 brandy INFO [oz.server:142] - Web server is running at `http://localhost:10666/`
Opening in existing browser session.
21-04-14 22:21:16 brandy INFO [oz.server:50] - Connected uids change: {:ws #{"b75d3026-919f-4927-a43c-ce678167348d"}, :ajax #{}, :any #{"b75d3026-919f-4927-a43c-ce678167348d"}}

 calling (oz/view! (line-plot))

 sleeping

您需要睡眠几秒钟,读取输入,或以其他方式保持线程的活力。如果不是,线程似乎在信息从JVM传输到浏览器之前就退出了。

结果如下(使用Chrome):

在内部,Oz使用clojure.java.browse,后者在内部使用java.awt.Desktop打开默认浏览器。

票数 2
EN

Stack Overflow用户

发布于 2021-10-27 05:52:25

看来Alan能帮你做到这一点,但要澄清一点:

如果您正在以脚本或程序的形式运行(从持续运行的REPL进程中运行),那么确实需要确保等待一些情节消息才能真正发送到前端(有睡眠或其他东西)。

这种延迟可能是不可避免的,并且是使用Sente进行异步websocket通信的结果(尽管使用任何websocket库都有类似的问题)。对于Sente,这个问题有点复杂,因为连接的建立方式有点奇怪,如果不等到完全建立起来,那么第一条消息就有可能迷失在以太中。最简单的事情就是等待几秒钟,但我的雷达上有一天会回来清理这个问题,这样一旦连接建立,客户端就会发送一条消息,直到接收到该消息时,情节信息才会发送。这可能会减少一些等待时间,但对我来说只是低优先级。对于典型的用法,第一个地块是唯一需要一段时间才能加载的;其他所有的地块都应该加载得非常快(除非它们特别大)。就像我说的,修复这个问题在我的雷达上,但是如果你有灵感的话,可以提交一个GitHub问题。

请注意,如果所有这些看起来都很烦人,您也可以使用Oz (oz/export!oz/compile)的静态输出功能来输出html文件或静态图像。这将阻塞直到完成,因此程序在发送websocket消息之前停止运行时不会出现相同的问题。

关于Oz是如何知道打开哪个浏览器的,JVM知道默认的浏览器设置,所以Oz可以使用它在任何设置为默认的浏览器中打开。我唯一遇到问题的地方是从Docker内部运行时,因为您通常无法从容器中运行浏览器(即使您在那里运行代码,例如利用预先准备好的python+clj环境)。但这是一个非常利基优势的案例,据我所收集到的,除了这一点外,它的效果还不错。

谢谢你尝试奥兹!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67099531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档