Clojurescript异步<?巨集

我一直<?在swanodette的代码中看到这个宏,它看起来非常有用:

在这个要点中

;; BOOM!!! we can convert async errors into exceptions
(go (try
      (let [x (<? (run-task (.-readFile fs) "foo.txt" "utf8"))]
        (.log js/console "Success" x))
      (catch js/Error e
        (.log js/console "Oops" e))))

在此博客文章中:

(go (try
      (let [tweets    (<? (get-tweets-for "swannodette"))
            first-url (<? (expand-url (first (parse-urls tweets))))
            response  (<? (http-get first-url))]
        (. js/console (log "Most recent link text:" response)))
      (catch js/Error e
        (. js/console (error "Error with the twitterverse:" e)))))

<?只是一点点的宏糖就扩展成类似(throw-err(<![expr]))。在core.async中,<!其作用与ES6的yield运算符相同。如果异步进程将错误写入其通道,我们会将其转换为异常。

但是我找不到它的定义。如何在Clojure {Script}中实现它?

好了,这就是到目前为止我正在使用的东西。可能还有改进的空间。

在Clojure中:

(defn throw-err [e]
  (when (instance? Throwable e) (throw e))
  e)

(defmacro <? [ch]
  `(throw-err (<! ~ch)))

在ClojureScript中:

(defn error? [x]
  (instance? js/Error x))


(defn throw-err [e]
  (when (error? e) (throw e))
  e)

(defmacro <? [ch]
  `(throw-err (<! ~ch)))

我完全不确定我的解决方案的可读性(throw-err看起来它应该抛出错误,但事实并非如此。至少不是每次都如此)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档