我遵循 这篇文章 来参与 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)))))