0

我正在尝试了解如何使用 node.js 和 socket.io。我在 PHP 之前使用过,但我无法理解如何在 node.js 中使用回调。

我有部分代码分配给 socket.io

if (validate_room(room)) {
    console.log('Room exist'); 
    io.sockets.clients(room).forEach(
        function (socket) {
            console.log(socket.id);
        });
    //do some fucnction using socket interface    
} else {
    console.log('Room not exist');
    //do other function using socket interface        
}

你可以看到,这里我需要访问 io.sockets 对象。

validate_room 上面的函数

function validate_room(room) {

    mysql_connection.query('SELECT * FROM rooms WHERE room = ' + mysql_connection.escape(room), function(err, rows, fields) {
        if (err)
            throw err;

        if (rows.length.toString() > 0) {
            console.log('Validate room - true: ', rows.length.toString());

            return true;
        }
        console.log('Validate room - false: ', rows.length.toString());
        return false;
    });
}

我需要第二个函数来返回“true / false”。

当我使用“浏览器”时,我只是将回调放入另一个外部函数,但在这里我需要访问 socket.io 对象。

所以我想让“if(validate_room(room))”在这里停下来等待结果真/假。

也许有人可以指出我的想法,我在哪里犯了错误。

最好的问候马克

4

2 回答 2

0

将这样的内容放入您的回调中:

if (err)
    throw err;
afterRoomValidation(rows.length.toString() > 0);

和功能:

function afterRoomValidation(isValid) {
    if (isValid) {
        console.log('Room exist'); 
        io.sockets.clients(room).forEach(function (socket) { console.log(socket.id);  });
        //do some fucnction using socket interface    
    } else {
        console.log('Room not exist');
        //do other function using socket interface        
    }
}
于 2013-03-13T20:41:01.360 回答
0

函数只返回“真/假”。

不,您不能这样做,就像您不能从函数的 AJAX 调用同步返回响应一样?. 使用回调:

function validate_room(room, validCallback, invalidCallback) {

    mysql_connection.query('SELECT * FROM rooms WHERE room = ' + mysql_connection.escape(room), function(err, rows, fields) {
        if (err)
            throw err;

        if (rows.length.toString() > 0) {
            console.log('Validate room - true: ', rows.length.toString());
            validCallback();
        } else
            console.log('Validate room - false: ', rows.length.toString());
            invalidCallback();
        }
    });
}

validate_room(room, function() {
    console.log('Room exist'); 
    io.sockets.clients(room).forEach(function (socket) {
        console.log(socket.id);
        //do some fucnction using socket interface
    });
}, function() {
    console.log('Room not exist');
    //do other function using socket interface        
});
于 2013-03-13T20:52:22.527 回答