2017-04-22 130 views
3

我困惑,什么是在这种情况下发生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'); 
    }); 
}); 

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

回答

0

emit方法的第三个参数接受一个将传递给服务器的回调函数,以便您可以用任何希望的数据调用确认函。这实际上非常方便并且节省了配对呼叫响应事件的努力。

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

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