评论由:wxlite 提出
似乎在这些情况下,strong>和 strong>的使用不正常,不仅仅是与 我在
clojure-1.8.0,clojurescript-1.7.228,core.async-0.2.374 中进行了测试。
此测试需要配合 nodejs 及 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 [])))))
`
结果应该是 "(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)))
现在按预期工作。
结果:[]