Socket.io传递回调函数

时间:2017-04-22 17:34:40

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

这是来自文档。如何将函数传递给服务器以进行回调?服务器如何调用客户端功能?我很困惑。

2 个答案:

答案 0 :(得分:2)

很明显,您无法直接从服务器调用客户端上的函数。

但你可以间接地轻松地做到这一点:

  1. 当客户端发送ferret消息时,它会在本地存储具有ID的给定函数。
  2. 客户端将此ID与消息一起发送到服务器。
  3. 当服务器想要调用客户端函数时,它会发回一条带有ID和函数参数的特殊消息。
  4. 当客户收到此特殊消息时,它可以通过其ID查找该功能并进行调用。
  5. 我不知道这是否与Socket.io完全相同,但可以合理地假设它与此类似。

    编辑:查看源代码(herehere),这确实与Socket.io的确如此相似。

答案 1 :(得分:0)

emit方法的第三个参数接受一个将传递给服务器的回调,以便您可以使用您希望的任何数据进行确认。它实际上非常方便,节省了配对呼叫响应事件的工作量。

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

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