评论由: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”非空)
(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)))
现在按预期工作
结果: []