Node.js 如何防止Twitter流中的回调在每次新tweet时触发?

Node.js 如何防止Twitter流中的回调在每次新tweet时触发?,node.js,twitter,asynchronous,callback,socket.io,Node.js,Twitter,Asynchronous,Callback,Socket.io,我的应用程序在推特流中筛选匹配的字符串。当它找到匹配项时,应该增加一个计数器,并通过socket.io将新计数发送给客户端。不幸的是,socket.io发出的是每一条tweet,而不是每一条匹配的tweet。它以指数级的频率发射,导致浏览器出现问题。如何防止在Twitter流中的每个新事件调用回调 以下是我的推特流代码: // Compares watchList (NYT Keywords) to Twitter stream, counts every mention exports.key

我的应用程序在推特流中筛选匹配的字符串。当它找到匹配项时,应该增加一个计数器,并通过socket.io将新计数发送给客户端。不幸的是,socket.io发出的是每一条tweet,而不是每一条匹配的tweet。它以指数级的频率发射,导致浏览器出现问题。如何防止在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中的代码。我希望每当有匹配的tweet时都会发出此消息

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')

var socket=io.connect(window.location.hostname);
console.log('hello world')
socket.on('watchUpdate',函数(数据){
console.log('chirp')
大约20秒后,我的浏览器被锁定。它看起来像这样:

写下这个问题后,我意识到处理更新的观察列表的回调函数位于twitter流中。无论推文是否命中IF语句,都会在每条推文中调用回调函数。如果我将回调函数放在IF语句中,则仍会在每条推文中调用回调函数


欢迎对node.js中回调的性质进行深入了解、提示或评论。

我的问题是我将emit嵌套在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);
           }
         });
       });
     });
   });
 };
这两个调整到位后,浏览器将接收匹配推文的实时更新