评论者: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 [])))))
`
结果应该是“(链接:)”(请求超时使“err”非nil)
(go (println "结果:" (<! 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-chan)))
现在按预期工作
结果:[]