Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Socket.io传递回调函数_Javascript_Socket.io - Fatal编程技术网

Javascript Socket.io传递回调函数

Javascript Socket.io传递回调函数,javascript,socket.io,Javascript,Socket.io,我对这种情况下发生的事情感到困惑 客户端: 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'); }); }); 服务器: socket

我对这种情况下发生的事情感到困惑

客户端:

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

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

这是文件上的。将函数传递给服务器进行回调有什么意义?服务器如何调用客户端函数?我很困惑。

emit方法的第三个参数接受一个回调,该回调将被传递到服务器,以便您可以调用任何您想要的数据作为确认。它实际上非常方便,并且省去了配对呼叫响应事件的工作量

确认是获取与已发送消息对应的响应的方式。以下是服务器端的代码片段

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

很明显,您不能直接从服务器调用客户机上的函数

不过,您可以轻松地间接执行此操作:

  • 当客户端发送
    ferret
    消息时,它将给定的函数以ID本地存储
  • 客户端将此ID与消息一起发送到服务器
  • 当服务器想要调用客户机函数时,它会向该函数发送一条带有ID和参数的特殊消息
  • 当客户端接收到这个特殊消息时,它可以通过其ID查找函数并调用它
  • 我不知道这是否正是Socket.io所做的,但有理由假设它与此类似



    编辑:查看源代码(和),这看起来确实与Socket.io的功能非常相似。

    为什么要回答“我不知道这是否正是Socket.io的功能…”@aarosil,因为我非常确定这与Socket.io的功能非常接近,如果不是的话。此外,我对这个问题的解释更多的是“这怎么可能”,而不是“Socket.io到底是如何做到的”。@Frxstrem不幸的是,您链接到了主分支上的行,而那些特定的行号不再是指适当的代码了…@swrobel谢谢,在我写这个答案时,我已经更新了引用特定提交的链接。