【问题标题】:Changing twitter stream predicates (Node.js, socket.io)更改 twitter 流谓词(Node.js、socket.io)
【发布时间】:2014-09-20 13:04:39
【问题描述】:

我正在使用Twit 构建一个推特流,用户可以在其中更改客户端的搜索词。 搜索词将保存在缓冲区中,并根据 Twitter 重新连接规则添加到流中。

我的代码如下所示:

var Twit = require('twit');

var T = new Twit({
    consumer_key:         'xxxxxxxxx'
  , consumer_secret:      'xxxxxxxxx'
  , access_token:         'xxxxxxxxx'
  , access_token_secret:  'xxxxxxxxx'
})

var searchStr = "orange";
var stream = T.stream('statuses/filter', { track: searchStr });

setInterval(function(){

    newSearchStr = getNewSearchStr();
    stream.stop();
    stream = T.stream('statuses/filter', { track:  newSearchStr});

},60*5*1000);


io.sockets.on('connection', function(socket) {

    //SAVE USER AND INTITIAL SEARCH CRITERIA
    // ...

    stream.on('tweet', function (tweet) {
        socket.emit('data',tweet);
    });

    socket.on('setSearchStr', function (searchStr) {

        //SAVE SEARCH TO BUFFER FOR getNewSearchStr() TO OBTAIN

    });
});

我的问题是用新的搜索重新初始化流。

在 inteval 函数中,stream.stop() 确实会停止流(并且 stream.start() 也可以工作),但 stream = T.stream(... 会打开一个新连接,而不是更新当前连接。因此,用户正在收听的流被断开,并且用户停止接收数据,直到刷新浏览器。

关于如何使用 Twit 做到这一点的任何想法?客户之间有什么实际区别吗?其他建议?

编辑: a similiar question 的答案有一个过时的链接。我真的很想看到带有“说明如何更改谓词并使用户体验尽可能流畅”的页面

【问题讨论】:

    标签: javascript node.js twitter socket.io


    【解决方案1】:

    也许不是最佳做法,但我最终通过直接编辑流对象解决了这个问题:

    setInterval(function(){
        //check if criteria has changed
        if(stream.params.track != searchStr){
            console.log("Reconnecting with " + searchStr);
    
            stream.stop();
            stream.params.track = searchStr;
            stream.start();
        }
        else {
            console.log("Criteria unchanged");
        }
    },60*5*1000);
    

    【讨论】:

    • 感谢您分享您的解决方案。这可能是我发现的实现流式更新(或者更确切地说断开/重新连接)的最佳示例。
    猜你喜欢
    • 2013-05-01
    • 2021-12-29
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2014-01-11
    相关资源
    最近更新 更多