【问题标题】:sending a socket.io .once message发送 socket.io .once 消息
【发布时间】:2018-04-11 02:13:53
【问题描述】:

这将在没有 .once 调用的情况下工作。

我正在尝试从服务器端代码发送一条消息

io.on('connect', function (socket) { socket.once('connect', function() { socket.emit('mydata', { feed: result});

但除非我删除第二行,否则我在客户端什么也得不到。 我也试过 socket.once('mydata', { feed: result}) 但是:

throw new TypeError('listener must be a function');

换句话说,只有当有新的“mydata”时,如何才能向客户端发送消息?

谢谢

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    首先,.once() 仅适用于事件侦听器 - 当您只想在下一次发生事件时收到通知,而不是在随后发生事件时收到通知。它与发送消息无关。

    您的特定代码试图做什么并没有真正意义。您在 connect 事件中,并且正在尝试侦听另一个 connect 事件?如果您更完整地描述您要完成的工作会有所帮助吗? “仅当有新的 mydata 时”是什么意思?如何判断是否有新的 mydata?

    如果您只是尝试发送mydata 消息,当客户端首次连接时,您可以这样做:

    io.on('connect', function(socket) {
        socket.emit('mydata', { feed: result });
    }
    

    如果您想确保即使在同一个套接字上重新连接,您也只向连接发送一次此消息,您可以这样做:

    io.on('connect', function(socket) {
        if (!socket.sentMydata) {
            socket.emit('mydata', { feed: result });
            socket.sentMydata = true;
        }
    }
    

    如果你想确保这个客户端只发送一次这个消息,即使页面被重新加载或者客户端导航离开和返回,那么你将不得不使用一个持久标记,比如 cookie 或一些会话 id 或类似的东西。

    【讨论】:

    • 根本问题是stackoverflow.com/a/16796375/3276634,这也影响了我。但是我们如何在 TypeScript 中处理这个问题呢? id 不适用,因为它在每个连接上都会更改。
    • @Lion - 这听起来你应该问自己的问题,展示你自己的代码,描述你自己的具体问题。
    【解决方案2】:

    我不确定我是否完全理解您的问题,但您可以使用映射。

    var sentHolder = {}
    
    socket.on("mydata", function(mydata){
    
        if(sentHolder[socket.id] == false) {
           //sent data to client with emit, this will run only once
           sentHolder[socket.id] = true
        }    
    
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      相关资源
      最近更新 更多