【发布时间】:2021-06-05 10:44:39
【问题描述】:
我正在尝试使用 Clojure(服务器)和 ClojureScript(客户端)构建一个简单的客户端-服务器系统。
服务器端正常(浏览器控制台上一切都是绿色的,没有CORS问题等);响应是纯文本(“真”或“假”)。在客户端,我基本上使用official cljs-http website中包含的功能
(defn get-request [str1 str2]
(go (let [response (<! (http/get "http://localhost:3000"
{:query-params {"str1" str1
"str2" str2}}))]
(prn response))))
在 REPL 上运行这个函数表明一切都很好,并且类似地图的东西从异步通道中出来
cljs.user=> (b/get-request "foo" "bar")
#object[cljs.core.async.impl.channels.ManyToManyChannel] ;; the result
cljs.user=> {:status 200, :success true, :body "false", [...]} ;; output of `prn`
我的问题是:我怎样才能真正从ManyToManyChannel“对象”中获得响应的正文?
- 为了测试,将函数的最后一个表达式更改为
(prn (:body response))打印 "false" 但仍然返回ManyToManyChannel - 将函数的最后一个表达式更改为
(:body response)出乎意料地返回相同的结果而不是“false”。
我该如何继续?
【问题讨论】:
-
您的函数返回的是 go 宏的结果,而不是其中的内容。
-
@JaredSmith:我知道——结果里面是
:body "false"条目。问题是如何获取该条目? -
调用代码中的consuming the returned channel。没有办法将异步操作变成同步操作,这就是重点。
-
@JaredSmith:我试过了,但
take!仅适用于 Clojure,我的客户端在 ClojureScript 上运行。我忽略了什么吗?谢谢 -
啊,错误的链接我的错。你想要
标签: clojurescript