2017-04-22 10 views
3

私はこのシナリオでは何が起こっているかのように当惑していますSocket.io通過コールバック関数

クライアント: Serverは

socket.emit('ferret', 'tobi', function (data) { 
    console.log(data); // data will be 'woot' 
}); 

io.on('connection', function (socket) { 
    socket.on('ferret', function (name, fn) { 
     fn('woot'); 
    }); 
}); 

これから提示されましたdocs。コールバックのために関数がサーバーに渡されていることは、どのような意味がありますか?サーバーはどのようにクライアント機能を呼び出すことができますか?私は非常に混乱しています。

答えて

0

emitメソッドの3番目の引数は、任意のデータで肯定応答を呼び出すことができるように、サーバーに渡されるコールバックを受け入れます。実際に便利で、ペアのコール応答イベントを保存する労力を節約できます。

肯定応答は、送信されたメッセージに対応する応答を取得する方法です。以下は、サーバー側のコードスニペットです。

io.sockets.on('connection', function(socket) { 
    socket.on('echo', function(data, callback) { 
    callback(data); 
    }); 
}); 
1

クライアントから直接関数を呼び出すことはできません。

あなたは簡単にいえ、間接的にこれを行うことができます。

  1. クライアントはferretメッセージを送信し、それがIDをローカルに与えられた関数を格納します。
  2. クライアントは、このIDをメッセージと共にサーバーに送信します。
  3. サーバがクライアント機能を呼び出そうとするとき、サーバはIDと引数を含む特別なメッセージを機能に戻します。
  4. クライアントがこの特別なメッセージを受け取ると、IDで関数をルックアップして呼び出すことができます。

これがSocket.ioとまったく同じものなのかどうかわかりませんが、これと似ていると仮定するのは妥当です。


編集:ソースコード(herehere)を見ると、これは確かにSocket.ioが何をするかはかなりあるように見えるん。

+0

なぜ、これがSocket.ioとまったく同じかどうかわかりません... " – aarosil

+0

@aarosil Socket.ioとまったく同じではないと確信しています。さらに、私はこの質問を「どのようにSocket.ioが正確にこれを行うのか」よりも「どのように可能か」と解釈しました。 – Frxstrem