如何防止Twitterstream中的callback触发每个新的tweet?

我的应用程序通过Twitterstream筛选匹配的string。 当它find一个匹配时,它应该增加一个计数器并通过socket.io发送新的计数给客户端。 不幸的是,socket.io正在发送每一个tweet,而不是每一个匹配。 它比需要的时间更频繁地发射,导致浏览器问题。 我怎样才能防止Twitterstream中的每个新事件调用callback?

这是我的twitterstream的代码:

// 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秒后,我的浏览器被locking。 它看起来像这样:

在这里输入图像描述

写完这个问题之后,我意识到处理更新的watchList的callback函数位于twitterstream中。 无论推特是否击中IF语句,callback似乎都会随着每条推文被调用。 如果我把callback放在IF语句中,callback仍然会被每一条推文调用。

欢呼任何有关node.jscallback的性质的暗示,暗示或评论。

我的问题是,我嵌套放在setInterval。 setInterval与每个callback堆叠。 如果你删除了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}); }); 

最后的一点是将我的callback放在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); } }); }); }); }); }; 

有了这两个调整,浏览器接收实时更新匹配推文。