使用RxJS和twitter-stream-api模块订阅流

时间:2017-03-05 21:25:41

标签: javascript stream rxjs twitter-streaming-api

好的,所以我是Rx的初学者,不幸的是js中的js和stream也是新手。我使用这个https://github.com/trygve-lie/twitter-stream-api连接到twitters流式api并通过推文接收json对象。到目前为止,我有这个代码

var Rx = require('rxjs/Rx');

var TwitterStream = require('twitter-stream-api'),
    fs = require('fs');
var filter = 'tweet';
var keys = {
    consumer_key : "key",
    consumer_secret : "secret",
    token : "token",
    token_secret : "tokensecret"
};

var Twitter = new TwitterStream(keys);
Twitter.stream('statuses/filter', {
    track: filter
});

Twitter.on('connection success', function (uri) {
    console.log('connection success', uri); 
});
Twitter.on('data', function (obj) {
    console.log(obj.text);
});

我成功地将推文写入控制台,但我真正想要学习的是使用流,尤其是RxJS。我已经尝试了所有可以想到的方法来创建一个可观察的。 Rx.Observable。创建/来自等...

我也尝试了Twitter.resume(),因为它显然暂停了,恢复流并观察它。我只得到错误,如不能.subscribe不是一个功能。根据我的上述内容,如何使用Rx.Observable开始过滤和播放数据?

谢谢!

2 个答案:

答案 0 :(得分:2)

RxJS 5没有任何方法可以将流转换为Observable,因此您需要自己完成此操作。理想情况下使用Observable.create

const Rx = require('rxjs');
const Observable = Rx.Observable;

var TwitterStream = require('twitter-stream-api'),

...

var source$ = Observable.create(observer => {
  var Twitter = new TwitterStream(keys);
  Twitter.stream('statuses/filter', {
    track: filter
  });

  Twitter.on('data', function (obj) {
    observer.next(obj);
  });

  return () => {
    Twitter.close();
  };
});

这使得一个冷的Observable只有在你订阅它时才能连接到Twitter。 Observable.create静态方法允许您将值推送给观察者,最后返回拆卸功能,然后关闭连接。取消订阅或Observable完成时会调用此函数。

然后你可以用你想要的任何东西链接这个Observable:

source$.filter(...).map(...)

请注意,还有Observable.bindCallback()Observable.bindNodeCallback()方法,但这些对您的情况无济于事。

了解更多:

答案 1 :(得分:0)

以下是使用desmondmorris / node-twitter和rxjs 5的示例。

const Observable = require('rxjs').Observable;

Observable
  .of(new require('twitter')({
    consumer_key: 'xxxx',
    consumer_secret: 'xxxx',
    access_token_key: 'xxxx',
    access_token_secret: 'xxxx',
  })).mergeMap(twitter =>
    Observable
    .fromEvent(twitter.stream('statuses/filter', {
        track: 'Stack Overflow'
      }),
      'data'))
  .filter(tweet => tweet.user.follow_count > 10000)
  .subscribe(console.log);