请在 Clojure 2024 状态调查 中分享您的想法!

欢迎!请参阅 关于 页面以获得更多此处如何工作的信息。

0
ClojureScript

我遵循 这篇文章 来参与 cljs 的实验,但想知道如何等待顶级 go 块,当在 REPL 中评估 go 块时会出现问题,因为它返回 #object[cljs.core.async.impl.channels.ManyToManyChannel]

编译到文件后,通过 node target/main.js 运行,似乎顶级 go 块被阻塞,等待其执行。

我怀疑这两种执行方式之间的差异与 go 的实现方式或事件循环的工作方式有关,但无法确定。

(go ;; how to wait this ??
  (let [browser (<! (u/new-browser))
        page (<p! (.newPage browser))]
    (try
      (<p! (.goto page "https://clojure.org"))
      (<p! (.screenshot page #js{:path "./target/screenshot.png"}))
      (catch js/Error err
        (println (ex-cause err)))
      (finally (<p! (.close browser))))))  ;; eval here return ManyToManyChannel

(defn new-browser [& {:as opts}]
  (let [pp-opts (-> opts
        (update :user-data-dir #(or % (str home-dir "/pp")))
        (clj->js :keyword-fn csk/->camelCase))]
    (go (<p! (.launch puppeteer pp-opts)))))

1 答案

0

经过一些研究,我可以自己回答这个问题。

因为 JavaScript 中没有阻塞 API,我们必须在 go 块中消耗 chan,所以没有办法读取最顶层的 go 块。

...