1

私はこれを持っています:

io.sockets.on('connection', function(socket) {
    socket.on("action1", function(data){
        socket.emit("action1", data);
    });
    socket.on("action2", function(data){
        socket.emit("action2", data);
    });
    socket.on("action3", function(data){
        socket.emit("action3", data);
    });
});

これ欲しい:

var socketMethods = {
    action1:function(data, socket){
        socket.emit("action1", data);
    },
    action2:function(data, socket){
        socket.emit("action2", data);
    },
    action3:function(data, socket){
        socket.emit("action3", data);
    }
}

io.sockets.on('connection', function(socket) {
    for(key in socketMethods){
        socket.on(key, socketMethods[key]);
    }
});

ただし、ソケットをメソッドに渡すことができず、最終的には

C:\__server\nodejs.js:217
    socket.emit('action1', {msg:"No account"}
               ^
TypeError: Cannot call method 'emit' of undefined

関数を介してソケットを渡そうとしました:

io.sockets.on('connection', function(socket) {
    for(key in socketMethods){
        socket.on(key, function(data, socket){
            socketMethods[key](data, socket);
        });
    }
});

ソケットは関数に渡されません。

メソッドを動的に呼び出しながら、メソッド内でソケットを使用するにはどうすればよいですか?

アップデート:

この正確なコードで:

io.sockets.on('connection', function(socket) {
    for(key in socketMethods){
        socket.on(key, function(data){
            socketMethods[key](data, socket);
        });
    }
});

とても興味深いものを見つけました。

それは機能し、メソッドから socket.emits を実行できます!

ただし、現在は LAST メソッドを実行するだけです。この場合、何が要求されても action3 が呼び出されます。アクション 1 またはアクション 2 を要求した場合でも、アクション 3 が呼び出されます。

アップデート:

console.log(socket._events) を実行すると、関数 error:[関数]、action1:[関数]、action2:[関数]、action3:[関数] が添付されていることがわかります。これらの関数のそれぞれに何が入っているかを確認しようとすると、得られるのはそれだけです。

function ack() {
      self.packet({
          type: 'ack'
        , args: io.util.toArray(arguments)
        , ackId: packet.id
      });
    }

機能に関係なく、私は自分自身に送り返します。また、action2 をオブジェクトの最後に設定しました。action2 が呼び出されます。まだ。通常の方法で socket.on メソッドをアタッチすると、socket._events ではまったく同じように見えます。

すべてのメソッドが「最後の」アクション(action3)によって上書きされているという理論がありました。

眠れない

4

1 に答える 1

0

私が犯した大きな間違いは、ループ データが常に存続すると想定して関数を送信しようとしたことです。代わりに、重要なデータの参照を受け取っていました。

さらに調査を行う必要がありますが、代わりに関数を作成する必要がありました

ebohlmanのおかげで、この投稿のためにこれを理解しました

socket.io for ループを使用して socket.on メソッドを追加する

function makeOn(key) {
  return function(data) {
    dummy.socketMethods[key].call(socket, data);
  }
}

for(key in dummy.socketMethods){
  socket.on(key, makeOn(key));
}
于 2012-10-19T14:12:11.483 に答える