2017-04-22 131 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