回调函数socket.io + node.js

时间:2014-11-06 15:05:51

标签: javascript node.js sockets socket.io

有一个客户端和服务器端代码:

客户端:

socket.on('connect',  function() {
        showSystemMessage('Connected.');

        socket.emit('setuser', wm, function(data){
            console.log(data);
            socket.emit('whoisonline', wm, function(data){
                getOnlineFriends(data);
            });
        });
    });

服务器

io.on('connection', function(socket) {
        socket.on('setuser', function (data, cb) {
            cb(data);
        });
});

我收到错误:

  

TypeError:undefined不是第18行的函数

第18行:

socket.on('setuser', function (data, cb) {
     cb(data); // Line 18
});

然后我尝试了你的解决方案,我得到了:

TypeError: undefined is not a function in line 35

socket.on('whoisonline', function (data, cb) {
            redis.sinter('user.friend:' + data.id, 'onlineusers', function(error, intersection) {

                friends.online = intersection;
                friends.total  = intersection.length;

                if(friends.total > 0){
                    intersection.forEach(function(entry) {
                        var socketid = clients[entry];
                        io.sockets.connected[socketid].emit('in', { id : data.id, total : friends.total });
                    });
                }

                cb(friends); // Line 35
            });
        });

2 个答案:

答案 0 :(得分:1)

Socket.io不能使用回调,你必须使用.emit()和.on()。在这种情况下,您的源代码如下所示:

<强>客户端:

socket.on('connect',  function() {
        showSystemMessage('Connected.');

        socket.emit('setuser', wm);
        socket.on("setuser", function(data){
            console.log(data);
            socket.emit('whoisonline', wm);
            socket.on("whoisonline", function(data) { 
                getOnlineFriends(data);
            });
        });
    });

服务器

io.on('connection', function(socket) {
        socket.on('setuser', function (data) {
            socket.emit("setuser", data);
        });
});

答案 1 :(得分:0)

就我而言,以下工作有效:

  • 在服务器端

    socket.on('setuser', (name, cb) => { cb(name); });
    
  • 在客户端

    socket.emit('setuser', 'user data', r => { console.log(r); });