首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure -使用core.async频道和Yada/Aleph

Clojure -使用core.async频道和Yada/Aleph
EN

Stack Overflow用户
提问于 2015-11-19 13:55:35
回答 1查看 1.1K关注 0票数 1

我正在尝试使用Clojure manifold库,为了理解它,我需要将core.async通道转换为流形流。

我想使用一个core.async通道创建以下等价的内容:

代码语言:javascript
复制
 (require '[manifold.stream :as s])
 (s/periodically 100 #(str " ok "))

  ;; Here is what I tried, it fails with an error 500
  (let [ch (chan)]
      (go-loop []
      (>! ch " ok ")
      (<! (timeout 100))
      (recur))
    (s/->source ch))

我正在尝试将一个core.async频道传送到yada。第一个代码示例(使用manifold.stream/periodic )工作,而其他代码示例使用core.async。我试过雅达1.0.01.1.0-SNAPSHOT

使用manifold.stream/periodic工作:

代码语言:javascript
复制
(def get-stream
  (yada (fn [ctx]
          (-> (:response ctx)
              (assoc :status 202)
              (assoc :body (s/periodically 1000 #(str (System/currentTimeMillis) " ")))))
        {:representations [{:media-type "application/json"
                            :charset    "UTF-8"}
                           {:media-type "application/edn"
                            :charset    "UTF-8"}]}))

使用manifold.stream/->source返回一个错误500:

代码语言:javascript
复制
(def get-stream
  (yada (fn [ctx]
          (-> (:response ctx)
              (assoc :status 202)
              ;; Similar to this : https://github.com/juxt/yada/blob/94f3ee93de155a8513b27e0508608691ed556a55/dev/src/yada/dev/async.clj
              (assoc :body (let [ch (chan)]
                             (go-loop []
                               (>! ch " ok ")
                               (<! (timeout 100))
                               (recur))
                             (s/->source ch)))))
        {:representations [{:media-type "application/json"
                            :charset    "UTF-8"}
                           {:media-type "application/edn"
                            :charset    "UTF-8"}]}))

;; Error on the page :

;; 500: Unknown
;; Error on GET

;; #error {
;;         :cause "No implementation of method: :to-body of protocol: #'yada.body/MessageBody found for class: manifold.stream.async.CoreAsyncSource"
;;         :via
;;         [{:type clojure.lang.ExceptionInfo
;;           :message "Error on GET"
;;           :data {:response #yada.response.Response{:representation {:media-type #yada.media-type[application/json;q=1.0], :charset #yada.charset.CharsetMap{:alias "UTF-8", :quality 1.0}}, :vary #{:media-type}}, :resource #function[backend.routes.examples.ts/fn--57734]}
;;                                                                                                  :at [clojure.core$ex_info invoke "core.clj" 4593]}
;;                                                                     {:type java.lang.IllegalArgumentException
;;                                                                      :message "No implementation of method: :to-body of protocol: #'yada.body/MessageBody found for class: manifold.stream.async.CoreAsyncSource"
;;                                                                      :at [clojure.core$_cache_protocol_fn invoke "core_deftype.clj" 554]}]
;;                                                    :trace

第三次尝试,使用core.async信道(不同的错误500):

代码语言:javascript
复制
(def get-stream
  (yada (fn [ctx]
          (-> (:response ctx)
          (assoc :status 202)
          (assoc :body (chan)))
        {:representations [{:media-type "application/json"
                            :charset    "UTF-8"}
                           {:media-type "application/edn"
                            :charset    "UTF-8"}]}))

;; Error on the page :

;; 500: Unknown

;; Error on GET

;; #error {
;;         :cause "No implementation of method: :to-body of protocol: #'yada.body/MessageBody found for class: clojure.core.async.impl.channels.ManyToManyChannel"
;;         :via
;;         [{:type clojure.lang.ExceptionInfo
;;           :message "Error on GET"
;;           :data {:response #yada.response.Response{:representation {:media-type #yada.media-type[application/json;q=1.0], :charset #yada.charset.CharsetMap{:alias "UTF-8", :quality 1.0}}, :vary #{:media-type}}, :resource #function[backend.routes.api.subscribe/subscribe$fn--64130]}
;;                                                                                                  :at [clojure.core$ex_info invoke "core.clj" 4593]}
;;                                                                     {:type java.lang.IllegalArgumentException
;;                                                                      :message "No implementation of method: :to-body of protocol: #'yada.body/MessageBody found for class: clojure.core.async.impl.channels.ManyToManyChannel"
;;                                                                      :at [clojure.core$_cache_protocol_fn invoke "core_deftype.clj" 554]}]
;;                                                    :trace
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-28 11:02:24

关键的错误是:

代码语言:javascript
复制
"No implementation of method: :to-body of protocol: 
 #'yada.body/MessageBody     
 found for class: manifold.stream.async.CoreAsyncSource"

它揭示了你正在使用的yada版本是试图胁迫一个它不理解的身体类型。最近版本的yada对于您可以发送到web服务器的内容更加宽容,并且允许任何它不知道如何转换的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33805901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档