Clojure RethinkDB订阅了更改源

时间:2015-08-30 22:14:25

标签: asynchronous clojure rethinkdb

我正在使用Clojure driver for RethinkDB。 我想从查询中获取更改提要。以下是我到目前为止的情况:

(defn change-feed [conn]
  (loop [changes (future
                   (-> (r/db "mydb")
                       (r/table "mytable")
                       r/changes
                       (r/run conn)))]
    (println "date : " ((comp :name :newval) first @changes)) ;;prints nil
    (recur (rest changes))))

在调用时阻塞我的REPL(这是正常的)。然后,我使用RethinkDB接口添加数据。它打印nil,我收到以下错误:

IllegalArgumentException Don't know how to create ISeq from: clojure.core$future_call$reify__6736  clojure.lang.RT.seqFrom (RT.java:528)

我做错了什么?我希望能够:

  • 从这个未来中获取物品
  • 也知道我一次可以拿走多少物品(如果有几个人在等待)

注意:我打算使用manifold来最终操作结果,所以使用它的任何解决方案都完全没问题。

1 个答案:

答案 0 :(得分:4)

我认为你不需要将来的块,clj-rethinkdb库返回的Cursor将会阻塞,直到它准备就绪。

您也可以使用doseq代替可能更自然的循环。

我是clj-rethinkdb的维护者,我们已经在管道中进行了更改,以呈现core.async接口和新的Cursor抽象。如果您想尽早使用它,请结帐https://github.com/apa512/clj-rethinkdb/pull/55