如何防止Twitter流中的回调触发每个新推文?

时间:2014-03-14 13:43:11

标签: node.js twitter asynchronous callback socket.io

我的应用程序通过Twitter流来筛选匹配的字符串。当它找到匹配时,它应该递增计数器并通过socket.io向客户端发出新计数。不幸的是,socket.io随每条推文发出,而不是每场比赛。它比预期更频繁地发出,导致浏览器问题。如何阻止回调被Twitter流中的每个新事件调用?

这是我的twitter流代码:

// Compares watchList (NYT Keywords) to Twitter stream, counts every mention
exports.keywordStream = function(callback) {
  exports.initializeFeed().then(function(watchList) {

  // enter the stream
    t.stream('statuses/filter', { track: watchKeywords }, function(stream) {

    // read twitter firehose ('data') for incoming tweets.
      stream.on('data', function(tweet) {
        var tweetText = tweet.text.toLowerCase();

        // compare the text of each tweet to each NYT keyword in the watchList
        _.each(watchKeywords, function(e) {

          // if the keyword exists in the tweet, += 1
          if (tweetText.indexOf(e.toLowerCase()) !== -1) {
            watchList.keywords[e] += 1;
            watchList.total += 1;
          }

        });
        callback(watchList);
      });
    });
  });
 };

这是app.js中的代码。我希望每当有匹配的推文时就会发出此消息。

io.sockets.on('connection', function(socket) {
  // console.log("client connected");
});

firehose.keywordStream(function(watchList) {
  // STREAMING . . .
  setInterval(function() {
    io.sockets.emit('watchUpdate', {'watchList': watchList});
  }, 1000/60);
});

这里只是我的观点文件中的一个片段:

<script>
 var socket = io.connect(window.location.hostname);
 console.log('hello world')
   socket.on('watchUpdate', function(data) {
   console.log('chirp')

大约20秒后,我的浏览器被锁定。它看起来像这样:

enter image description here

写完这个问题之后,我意识到处理更新的watchList的回调函数位于twitter流中。每条推文都会调用回调,无论推文是否符合IF语句。如果我将回调放在IF语句中,那么每次推文都会调用回调。

欢迎对node.js中回调性质的任何见解,提示或评论。

1 个答案:

答案 0 :(得分:0)

我的问题是我在setInterval中嵌套了。 setInterval与每个回调堆叠在一起。如果删除setInterval(),io.sockets.emit将按预期执行。

// app.js
io.sockets.on('connection', function(socket) {
  // console.log("client connected");
});

firehose.keywordStream(function(watchList) {
  io.sockets.emit('watchUpdate', {'watchList': watchList});
});

最后一步是将我的回调放在IF语句中,以确保它仅在匹配的关键字上触发。

 // twitter firehose
 exports.keywordStream = function(callback) {
   exports.initializeFeed().then(function(watchList) {

     // enter the stream
     t.stream('statuses/filter', { track: watchKeywords }, function(stream) {

       // read twitter firehose ('data') for incoming tweets.
       stream.on('data', function(tweet) {
         var tweetText = tweet.text.toLowerCase();

         // compare the text of each tweet to each NYT keyword in the watchList
         _.each(watchKeywords, function(e) {

           // if the keyword exists in the tweet, += 1
           if (tweetText.indexOf(e.toLowerCase()) !== -1) {
             watchList.keywords[e] += 1;
             watchList.total += 1;
             callback(watchList);
           }
         });
       });
     });
   });
 };

通过这两个调整,浏览器会收到匹配推文的实时更新。