2024 Clojure状况调查!分享你的想法。

欢迎!请参阅关于页面,了解更多关于该功能的信息。

0
IO

我正尝试读取一个JSON HTTP流,并无限使用其json元素。

我写下了下面的代码,但它关闭了流并且只返回了30个结果 —— 我怎样才能无限使用HTTP流呢?

谢谢你的帮助!

(ns core
  (:require [clj-http.client :as http]
            [cheshire.core :as json]
            [clojure.java.io :as io]
            [clojure.core.async :as async]))

(def gh-url "https://api.github.com/events")
(def chan (async/chan 100))

(async/go
  (loop [r (async/<! chan)]
    (when (not-empty r) (println (:type r)))
    (recur (async/<! chan))))

(defn read-gh-stream [url]
  (with-open [stream (-> url (http/get {:as :stream}) :body)]
    (let [lines (-> stream io/reader (json/parse-stream true))]
      (doseq [l lines]
        (async/go
          (async/>! chan l))))))

1 答案

+1

Github API在每次http调用中只会返回30个事件,不会持续向发送事件。如果你想获取下一个30个事件,你将不得不再次调用Github API。请参见以下文档: https://developer.github.com/v3/activity/events/

谢谢回复!我将尝试使用Twitter持久HTTP流。

我编写的代码能正确无误吗?或是`do-seq`会关闭流?

PS:我还在尝试通过流将日志文件传输至`core.async`,但文件连接总是在某个时候断开。

编辑
`.with-open`会在`doseq`处理完主体后关闭流。每次都需要重新运行`read-gh-stream`。
如果`lines`是惰性的,我预计`doseq`会持续处理流,尽管`parse-stream`文档中表示

如果顶级对象是一个数组,它将被惰性解析
谢谢,我明白了。

我仍然在尝试读取(不断更新的)日志文件,并将每一行发送到频道。我似乎找不到展示如何实现此功能的示例。
...