Node.js 如何防止Twitter流中的回调在每次新tweet时触发?
我的应用程序在推特流中筛选匹配的字符串。当它找到匹配项时,应该增加一个计数器,并通过socket.io将新计数发送给客户端。不幸的是,socket.io发出的是每一条tweet,而不是每一条匹配的tweet。它以指数级的频率发射,导致浏览器出现问题。如何防止在Twitter流中的每个新事件调用回调 以下是我的推特流代码: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
// 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);
}
});
});
});
});
};
这两个调整到位后,浏览器将接收匹配推文的实时更新