2011-02-08 9 views
1

この問題の説明が難しいので、関連性の高い用語が分かっていれば編集してください。リアルタイムWebアプリケーションのサーバーレスポンスのコンテキストを扱う

私は本質的にRedis(PubSub)+ Node.js + Socket.IOを配布サーバとして使用するWebアプリケーションを構築しています。

私は問題なく動作する双方向通信を持っていますが、クライアントから(非同期的に)要求を行い、応答を処理できる必要があります。それ。

これは私がこれまで持っているものですが、私はこのアプローチには特に満足していない:

サーバー

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

クライアント

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; DR :サーバーに何か「質問」して、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

関連する問題