2013-03-13 2 views
0

Я пытаюсь узнать об использовании node.js и socket.io. Я использовал до PHP, и у меня возникли проблемы с пониманием того, как использовать обратные вызовы в node.js.node.js и socket.io как использовать обратный вызов?

У меня есть часть кода, присвоенного 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; 
    }); 
} 

мне нужна вторая функция, чтобы просто вернуть "истина/ложь".

Когда я использовал «браузер», я просто ввел обратный вызов в другую внешнюю функцию, но здесь мне нужен доступ к объекту socket.io.

Поэтому я хотел бы иметь «if (validate_room (room))» здесь останавливается и ждет результата true/false.

Возможно, кто-то может указать мне, где я ошибаюсь в своих мыслях.

С наилучшими пожеланиями Марк

ответ

0

функция просто возвращать "истина/ложь".

Нет. Вы не можете сделать это так же, как вы, 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   
}); 
+0

Спасибо. Ваше решение решает мою проблему. Теперь я понял, как использовать эти обратные вызовы. – marc234

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   
    } 
} 
+0

В node.js легко заблудиться в цепи обратных вызовов. Существует много способов, шаблонов и библиотек, чтобы избежать этого. Какой из них лучше для вас, зависит от проблемы и типа приложения, которое вы разрабатываете. –

Смежные вопросы