我的应用程序通过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秒后,我的浏览器被锁定。它看起来像这样:
写完这个问题之后,我意识到处理更新的watchList的回调函数位于twitter流中。每条推文都会调用回调,无论推文是否符合IF语句。如果我将回调放在IF语句中,那么每次推文都会调用回调。
欢迎对node.js中回调性质的任何见解,提示或评论。
答案 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);
}
});
});
});
});
};
通过这两个调整,浏览器会收到匹配推文的实时更新。