【发布时间】:2014-10-21 12:46:46
【问题描述】:
当然,我想用 core.async 包装对外部服务的各种请求,同时仍然通过一些 chan 返回这些操作的结果。
我想同时处理抛出的异常和超时(即操作返回的时间比预期的要长,或者能够为同一任务选择不同的服务,但具有不同的方法或服务质量。
显示能够处理错误、超时和正确返回结果的示例的最小可行示例似乎是这些:
(require '[clojure.core.async :refer [chan go timeout <! >! alt!]])
(def logchan (chan 1))
(go (loop []
(when-let [v (<! logchan)]
(println v)
(recur))))
(dotimes [_ 10]
(go
(let [result-chan (chan 1)
error-chan (chan 1)
timeout-chan (timeout 100)]
(go
(try
(do (<! (timeout (rand-int 200)))
(>! result-chan (/ 1 (rand-int 2))))
(catch Exception e (>! error-chan :error))))
(>! logchan (alt! [result-chan error-chan timeout-chan]
([v] (if v v :timeout)))))))
这段代码打印出类似的东西
1
:error
1
:error
:error
:timeout
:error
:timeout
:timeout
这不是很优雅。我特别不喜欢返回:error 和:timeout 的方式。 nil-check in alt! 显然也不是我想要的。
有没有更好的方法来实现返回结果、防止长时间超时和处理错误这三个目标?语法还算可以(上面的大部分内容确实是为了挑起这三个错误)。
【问题讨论】:
标签: clojure core.async