2015-08-28 3 views
1

Я новичок в clojure. Я пытаюсь получить потоковые твиты через clojure. Я использую библиотеку twitter-api для получения потоковых твитов, а фрагмент кода - следующий.Как получить потоковые твиты, используя twitter-api в clojure?

(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*) 

The body part in return json предполагается постоянно обновлять. Я получаю значение: тело похоже на <[email protected]: :pending>, и я не могу понять, как получить твиты.

Как установить непрерывное соединение, чтобы получить потоковые твиты в качестве вывода?

ответ

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

Promise возвращаются обратно. Я не могу получить твиты только разыгрывая обещание. Итак, как выполнить обещание, чтобы получить потоковые твиты? – sammy

+0

Извините, теперь я вижу. Я полагаю, что если это бесконечный поток, тогда обещание никогда не будет иметь конечной стоимости. Возможно, вам нужно использовать «доза» по разыменованному обещанию для выполнения побочного эффекта при каждом появлении твита? – TheQuickBrownFox

Смежные вопросы