web-dev-qa-db-ja.com

socket.io:クライアント側のemitコールバックは発生しません

概念実証のためだけにsocket.ioをいじりまわしますが、これまでのところ、emitコールバックをクライアント側で機能させることができないことを除いて、すべてがうまく機能しています。私はここで愚かな何かを見逃している必要がありますが、ドキュメントは現時点ではキラーではありません。サーバーは「getSomeData」イベントを問題なく取得し、エラーは発生しません。

クライアントのsocket.ioソースでわかることから、発行する最後の引数が関数であるかどうかをチェックし、常にそれをコールバックとして使用しますが、それよりも深いデバッグは私にとって問題でした。

ここでいくつかのコアコンセプトを見逃さなければならないような気がします。これはthis.send(..)が行うことになっていることではありませんか?サンプルアプリでは1つの使用法しか見つかりませんでしたが、そのイベント排出のクライアント側コードが利用できる場所はありませんでした。

更新:明確にするために、私は実際に意図的にイベントクライアント側を発行しています。これの目的は、socket.ioを使用して、クライアントがプッシュの受信に加えて要求に応じてデータをプルできるかどうかを確認することでした。

サーバ:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
    socket.on("getSomeData", function() {
        this.send({data: "some random data"});
    });
});

クライアント:(console.logは発生しません)

<script type="text/javascript" src="http://localhost/socket.io/socket.io.js"></script>
<script type="text/javascript">
  var socket = io.connect('http://localhost');
  socket.emit("getSomeData", function(data) {
      console.log(data);
  });
</script>
11
jdc0589

ロジックが切り替わったようです。試してみてください...

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
    socket.emit("getSomeData",{data: "some random data"});
});

とクライアント...

<script src="http://localhost/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on("getSomeData", function(data) {
      console.log(data);
  });
</script>

編集:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
    socket.on("getSomeData", function(name,fn) {
        fn({data: "some random data"});
    });
});

クライアント

<script src="http://localhost/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.emit("getSomeData", function(data) {
      console.log(data);
  });
</script>
22
Lime

Liam Williamの回答では、クライアントの3番目の引数としてコールバック(または確認応答関数)を送信する必要があることがわかりました。

クライアント:

<script src="http://localhost/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.emit("getSomeData", null, function(data) {
    console.log(data);
});
6

コールバックを設定することはできますが、少し異なる方法で行う必要があります。


サーバー:(app.js)

var io = require('socket.io')(80);

io.on('connection', function (socket) {
// please note that server will take 2 data entries as function parameter below
  socket.on('ferret', function (name, fn) {
    fn('woot');
  });
});

クライアント(index.html)

var socket = io(); // TIP: io() with no args does auto-discovery
socket.on('connect', function () {
socket.emit('ferret', 'tobi', function (data) {
    console.log(data); // data will be 'woot'
});
});

実際、socketioもこれについて言及しています。 sending-and-getting-data-(acknowledgements)

1
Xin