socket.io 中的 emit 方法的成功回调

Posted

技术标签:

【中文标题】socket.io 中的 emit 方法的成功回调【英文标题】:Success Callback for emit method in socket.io 【发布时间】:2012-11-13 00:54:11 【问题描述】:

我正在尝试从我的客户发出自定义消息。我需要对其成功和失败执行一些操作。现在,如何将成功回调附加到 emit 方法?

对于错误回调,我使用了Exposed events doc 并使其正常工作

socket.on('error', () -> console.log("Error Occured"))

为了成功,我试过了

socket.emit('my custom method', content: json,() -> console.log("Emitted"))

无论成功还是失败,都不会触发此回调。

如何获取成功处理程序?

【问题讨论】:

请不要接受this 的答案,支持this 一个。 【参考方案1】:

如果您查看文档,它会向您展示一个传递回调函数的示例-最后一个示例:http://socket.io/docs/#Sending-and-getting-data-acknowledgements

前 服务器:

    socket.on('formData', 
              function(data, fn)
                      // data is your form data from the client side
                      // we are here so we got it successfully so call client callback
                      // incidentally(not needed in this case) send back data value true 
                      fn(true);
              
             );

客户:

      socket.emit('formData', 
                  data, 
                  function(confirmation)
                          // send data
                          // know we got it once the server calls this callback      
                          // note -in this ex we dont need to send back any data 
                          // - could just have called fn() at server side
                          console.log(confirmation);
                  
                 );

【讨论】:

这不是反向工作吗?我尝试从服务器发送一个回调函数并在客户端调用它,但似乎回调甚至没有到达客户端。 +1 另请注意,这不适用于广播github.com/cayasso/primus-rooms/issues/28 当您可以传递回调函数并使用 socket.on 事件上的数据触发回调时,我认为标记的答案是一种草率的方法。【参考方案2】:

你的第二个代码没有做任何事情的原因是socketIO中暴露的事件只是为socket.on方法定义的。因此,您需要在服务器 app.js 中添加另一个发射来完成此操作

客户端发出自定义消息并通过 socket.emit 将 JSON 数据发送到套接字,他还获得一个处理成功回调的更新函数

socket.emit ('message', hello: 'world');
socket.on ('messageSuccess', function (data) 
 //do stuff here
);

服务器端从客户端发出的消息中获取调用,并将 messageSuccess 发送回客户端

socket.on ('message', function (data) 
 io.sockets.emit ('messageSuccess', data);
);

您可能会根据这种行为制作一个模块,以便为您希望以这种方式处理的每条消息附加它。

【讨论】:

我有点疑惑,哪个更好,emit 来自服务器的事件或来自客户端的回调函数。 socket.emit ('message', hello: 'world', function() //do stuff here );这两种方式有区别吗? 回调函数不应该仍然有效吗?为什么回调不能 100% 工作,我可以让回调工作 50%。 这不应该是“正确”的答案,因为 socket.io 支持“确认函数”,您可以在其中传递在“另一端”调用的函数。请查看其他分析器! 虽然这可能不是“正确”的答案。但是当使用一个非标准的(或不完整的)socket.io 客户端(如 python-socketio)时,还没有确认支持,这就是你这样做的方式。如果我错了,请纠正我。

以上是关于socket.io 中的 emit 方法的成功回调的主要内容,如果未能解决你的问题,请参考以下文章

socket io发出失败的回调

socket io 发出失败的回调

socket.io简单总结

socket.io 发出回调合适吗?

io.sockets.socket(socket_id).emit() - 没有方法'socket'

Nest.js 中的 Socket.io 确认