如何使用另一个函数的socket事件?

时间:2016-07-04 17:01:39

标签: node.js sockets socket.io

在socket.io中,我们创建一个实例并使用这样的套接字

var server = require('http').createServer();
var io = require('socket.io')(server);
io.on('connection', function(socket){
  socket.on('event', function(data){});
  socket.on('disconnect', function(){});
});
server.listen(3000);

我们如何在其他函数中创建套接字事件。对此有什么办法或诀窍。

var server = require('http').createServer();
var io = require('socket.io')(server);
io.on('connection', function(socket){
  socket.on('event', function(data){});
  socket.on('disconnect', function(){});
});

var f1 = function (socketID) {
    if(socketID){
        io.to(socketID).emit('event1', 'event1 data'); //working
        socket.on('call2', function (data) { // not working
        });
    }
}
server.listen(3000);

1 个答案:

答案 0 :(得分:0)

当您发送请求并尝试等待对该请求的特定响应时,对于这种情况使用基于消息的协议(如socket.io)有点棘手。 HTTP完美地设计用于请求/响应,因为单个连接仅用于那个请求/响应,因此响应是属于您的请求的响应。

socket.io不是这样。这是一个基于消息的方案。当您发送消息然后等待来自另一端的消息(在多用户环境中)时,您必须非常小心,不要:

  1. 安装太多的事件侦听器并最终重复。
  2. 您获得的回复是专门针对您的原始请求,而不是针对可能在相似时间范围内发生的其他请求。
  3. 解决此问题的一种方法是向所有请求/响应消息添加请求标识符。发送请求时,您将添加唯一的请求ID。返回响应时,它包含该请求ID,然后您的代码可以告诉哪个响应属于哪个请求。

    以下是关于如何实现请求ID概念的想法(这需要另一端合作并返回它发送的相同请求ID):

    var idCntr = 0;
    function f1(socketID) {
        if(socketID){
            var id = idCntr++;
            io.to(socketID).emit('event1', {id: id, data: 'event data'});
    
            function listener(data) {
                // if this is our message
                if (data.id === id) {
                    // once our response is received, remove event handler
                    socket.removeListener('responseToEvent1', listener);
    
                    // process response here
                    // code here...
                }
            }
    
            // wait for our response
            socket.on('responseToEvent1', listener);
        }
    }
    

    或者,这是一个更面向对象的方案,它将一个方法添加到名为.emitRequest()的套接字对象中:

    var idCntr = 0;
    socket.emitRequest = function(msg, data, responseMsg, responseFn) {
    
        var id = idCntr++;
    
        function listener(response) {
            // if this is our message
            if (response.id === id) {
                // once our response is received, remove event handler
                this.removeListener(responseMsg, listener);
                // call response handler
                responseFn(response.data);
            }
        }
    
        this.emit(msg, {id: id, data: data});
        this.on(responseMsg, listener);
    }
    

    注意:对于这两段代码,连接的另一端需要合作并返回原始请求的id属性,以便接收侦听器可以判断哪个响应与哪个请求有关。< / p>