node.js和socket.io如何使用回调?

时间:2013-03-13 20:04:28

标签: javascript node.js callback

我试图了解如何使用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))"这里停下来等待结果为真/假。

也许有人可以指出我,我在思考中犯了错误。

祝你好运 马克

2 个答案:

答案 0 :(得分: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        
    }
}

答案 1 :(得分:0)

  

函数只返回“true / false”。

没有。你不能像can't synchronously return the response from an AJAX call from a function?那样那样做。使用回调:

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        
});