请在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`,但连接到文件总是在某个时刻关闭。




...