1

クライアントアプリとサーバーアプリ(node.js、通信用のsocket.io)を開発しています。クライアントとサーバーの間で送信されるメッセージにはさまざまなタイプがあり、最初は送信されるオブジェクトにタイプを含めることを考えていました。

// Client
var data = {
  "type" : 5,
  "message" : "Hello, world!"
};
socket.emit("generic_event", data);

サーバー側では、これは次のように処理されます。

// Server
socket.on("generic_event", function(e){
  console.log("Got a generic_event!", e.type);
});

ただし、イベントの種類をより具体的にする可能性もあります。たとえば、次のようになります。

// Client
socket.emit(data.type, data);
// Server
socket.on(1, function(){
  console.log("We got '1'!");
});
// Elsewhere on in the server...
socket.on(5, function(){
  console.log("We got '5'!");
});

スキーム A (単一のジェネリック/キャッチオール イベント) とスキーム B (複数/多くの特定の名前付きイベント) に従うことの利点を知りたいです。パフォーマンス?個人的なコーディング スタイル? 他の何か?

4

2 に答える 2

1

メッセージはどちらの方法でもクライアントに送信されるため、ほとんどの場合は好みの問題です。ただし、クライアントから確認を受け取りたい場合は、各イベントを個別に処理する方がクリーンであり、データをどう処理するかを実行しif/elseたり決定したりする必要はありません。switch

これは、イベントが発生したときにサーバーに通知するクライアント コードの例です。

socket.on('event', function(fn) {
  fn();
});

ただし、オブジェクトの型を送信した場合でも、コールバックは 1 つしかありません。次に、クライアントがコールバックでサーバーに送信する応答のタイプを定義する必要があります。したがって、これは次の違いになります。

socket.on('foo', function(data, fn) {
  // foo data
  fn();
});

socket.on('bar', function(data, fn) {
  // bar data
  fn();
});

この:

socket.on('event', function(data, fn) {
  var res = {};
  // data of undefined type
  if (data.property == 'a_condition') {
    res.type = 'type1';
    res.data = 'foo';
  }
  else if (data.property == 'a_condition') {
    res.type = 'type2';
    res.data = 'bar';
  }
  fn(res);
});

つまり、方法に関係なく、サーバーからクライアントにデータが送信され、クライアント側でイベントが発生するため、個人的な好みの問題です。イベントの特定のハンドラーをお勧めします。

于 2013-09-18T02:13:44.230 に答える
0

socket.io-eventsnpmでチェックアウト

var io = require('socket.io')(3000);
var router = require('socket.io-events')();
router.on('*', function (sock, args, next) {
  var name = args.shift(), msg = args.shift();
  sock.emit('received event', name, msg);
});
io.use(router);
于 2014-07-02T17:21:45.260 に答える