评论者:wxlite
似乎在许多情况下,and 的行为异常,而不仅限于 <!
我在以下环境中进行了测试
clojure-1.8.0,clojurescript-1.7.228,core.async-0.2.374。
此测试需要带有 nodejs 和 request 模块的 request。
(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:" (++ 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)))
现在按预期工作
result: []