由 wxlite 发表的评论:
似乎 and 在许多情况下工作异常,而不仅仅是与 <! 一起。
我在
clojure-1.8.0,clojurescript-1.7.228,core.async-0.2.374 中进行了测试。
该测试需要带有 request 模块的 nodejs。
(def request (js/require "request"))
现在我尝试向一个不可访问的站点发送请求: google。
是的,我无法使用 google。
`
(def result-chan (chan))
(request
"http://www.google.com"
(fn [err res body]
(go
(if (and (not err) (= (.-statusCode res) 200))
(>! result-chan body)
(>! result-chan [])))))
`
结果应该是 "(link: )" (请求将超时使 "err" 非空)
(go (println "result:" (<! result-chan)))
但实际上我得到
1. _TypeError: Cannot read property 'statusCode' of undefined ..._ {color}
我已打印 err,并且我确信在这种情况下它是一个 JS 对象,而不是 nil 或 false。这就是为什么 res 是未定义的。
这也意味着 and 的小路不通。
为了纠正这一问题,请使用"if"而不是"and"。
`
(def result-chan (chan))
(request
"http://www.google.com"
(fn [err res body]
(go
(if (not err)
(if (= (.-statusCode res) 200)
(>! result-chan body)
(>! result-chan []))
(>! result-chan [])))))
`
然后再次测试。
(go (println "result:" (<! result-chan)))
现在按预期工作。
结果:[]