2011-02-08 2 views
1

Нахождение сложного описания этой проблемы - поэтому, пожалуйста, отредактируйте, если вы знаете более релевантные термины.Работа с контекстом ответов сервера в веб-приложениях реального времени

Я создаю веб-приложение, которое по существу использует Redis (PubSub) + Node.js + Socket.IO в качестве сервера распространения.

У меня двусторонняя связь, без проблем, но мне нужно иметь возможность сделать запрос на сервер от клиента (асинхронно) и обработать ответ, продолжая обрабатывать другие нерелевантные ответы, которые могут возникнуть раньше Это.

Это то, что я до сих пор, но я не особенно доволен этим подходом:

сервера

// 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) { 
      // call relevant function 
     } 
    }); 
}); 

function object_exists(object_id) { 
    // do stuff to check object exists 
    client.send({method: 'object_exists', value: object_exists}); 
} 

Client

var call = Array(); 
$(document).ready(function() { 
    socket.connect(); 
    socket.on("message", function(obj){ 
     console.log(obj); 
     call[obj.method](obj.value); 
    }); 
}); 

function object_exists(object_id) { 
    socket.send({method: 'object_exists', value: object_id}); 
    // Set a function to be called when the next server message with the 'object_exists' method is received. 
    call['object_exists'] = function(value) { 
     if(value) { 
      // object does exist 
     } 
    } 
} 

Tl; др : Мне нужно «спросить» сервер, а затем обработать ответ с помощью Socket.IO.

ответ

1

Вы не говорите конкретно, почему вы недовольны своим подходом, но мне кажется, что вы почти там. Я не совсем уверен, что вы пытаетесь сделать с массивом вызовов, поэтому я просто взял его для ясности.

В принципе, вам просто нужно настроить оператор 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 project.

+0

Спасибо, это в основном, как я это сделал. – Tom

+0

Да, извините, я не видел, что это был старый вопрос, пока я не ответил! – jslatts

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

  • Нет связанных вопросов^_^