2015-08-28 97 views
1

我是clojure的新手。我正在嘗試通過clojure獲取流媒體推文。我使用twitter-api庫來獲取流媒體推文,代碼片段如下。如何在clojure中使用twitter-api獲取流媒體推文?

(ns hello-twitter 
    (:use 
    [twitter.oauth] 
    [twitter.callbacks] 
    [twitter.callbacks.handlers] 
    [twitter.api.streaming]) 
    (:require 
    [clojure.data.json :as json] 
    [http.async.client :as ac]) 
    (:import 
    (twitter.callbacks.protocols AsyncStreamingCallback))) 

(def my-creds (make-oauth-creds "app consumer key" 
           "app consumer secret" 
           "user-access-token" 
           "user-access-token-secret")) 

(def ^:dynamic 
    *custom-streaming-callback* 
    (AsyncStreamingCallback. (comp println #(:text %) json/read-json #(str %2)) 
         (comp println response-return-everything) 
        exception-print)) 

(statuses-filter :params {:track "Cricket"} 
     :oauth-creds my-creds 
     :callbacks *custom-streaming-callback*) 

返回的json中的body部分應該不斷更新。我得到的價值:身體就像<[email protected]: :pending>,我無法弄清楚如何得到推文。

如何建立不間斷連接以獲取流式tweets輸出?

回答

0

此值爲promise。不是在通過網絡發送請求時阻塞線程,而是創建一個承諾並將其返回給您,以便您的程序可以繼續執行。稍後的承諾需要用deref@取消引用以獲取該值。

實施例從鏈接的文檔複製:

;; Create a promise 
user> (def p (promise)) 
#'user/p ; p is our promise 

;; Check if was delivered/realized 
user> (realized? p) 
false ; No yet 

;; Delivering the promise 
user> (deliver p 42) 
#<[email protected]: 42> 

;; Check again if it was delivered 
user> (realized? p) 
true ; Yes! 

;; Deref to see what has been delivered 
user> @p 
42 

;; Note that @ is shorthand for deref 
user> (deref p) 
42 
+0

無極被返回。我無法通過取消承諾來獲取推文。那麼,如何實現承諾,以便我可以獲得流媒體推文? – sammy

+0

對不起,我現在看到了。我想如果這是一個無限的流,那麼承諾永遠不會有最終的交付價值。也許你需要在取消引用的承諾中使用'doseq'來在每條推文發生時執行副作用? – TheQuickBrownFox

相關問題