评论由: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" 非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)))
现在工作如预期。
结果:[]