Вы конкретно не говорите, почему вы недовольны вашим подходом, но мне кажется, что вы почти у цели. Я не совсем уверен, что вы пытаетесь сделать с массивом вызовов, поэтому я просто взял это для ясности.
По сути, вам просто нужно настроить оператор switch, чтобы он действовал как маршрутизатор сообщений на каждой стороне соединения сокета, и запустить соответствующие методы, основанные на входящих сообщениях. Отправьте достаточно сообщения вместе с самим сообщением, чтобы вы могли справиться с работой без какого-либо дополнительного контекста. В вашем переработанном коде я отправляю object_id на сервер и снова обратно клиенту.
///SERVER
// Lots of other code
redis.psubscribe('*');
redis.on("pmessage", function(pattern, channel, message) {
// broadcast
});
io.on('connection', function(client) {
client.on('message', function(message) {
switch(message.method) {
case 'object_exists':
object_exists(message.objectId);
break;
}
});
});
//Takes an id an returns true if the object exists
function object_exists(object_id) {
// do stuff to check object exists
client.send({method: 'object_exists', objectId: object_id, value: object_exists});
}
///CLIENT
$(document).ready(function() {
//setup the message event handler for any messages coming back from the server
//This won't fire right away
socket.on("message", function(message){
switch(message.method) {
case 'object_exists':
object_exists(message.objectId, message.value);
break;
}
});
//When we connect, send the server the message asking if object_exists
socket.on("connect", function() {
socket.send({method: 'object_exists', objectId: object_id});
});
//Initiate the connection
socket.connect();
});
//Get's called with with objectId and a true if it exists, false if it does not
function object_exists(objectId, value) {
if(value) {
// object does exist, do something with objectId
}
else {
// object does not exist
}
}
Если вы хотите увидеть еще кучу кода в одном стеке, выполняющего работу, аналогичную той, которую вы пытаетесь выполнить, посмотрите мой проект nodechat.js .