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块。

...