socket.io:客户端发出的回调永远不会触发

时间:2011-07-20 02:08:28

标签: javascript node.js socket.io

使用socket.io来解决概念问题,到目前为止,everthing工作得很好,除了我无法让我的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>

3 个答案:

答案 0 :(得分:22)

看起来你有一些逻辑转换,试试......

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>

答案 1 :(得分:6)

在Liam William的回答中,我发现有必要将回调(或确认函数)作为客户端发出的第三个参数发送:

客户端:

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

答案 2 :(得分:1)

您可以进行回调,但必须采用不同的方式:

服务器:(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'
});
});

实际上,socket io也提到了这个; sending-and-getting-data-(acknowledgements)