Pq o emit é passado com 3 parametros, no caso, duas strings, e uma callback, e no servidor o on recebe só uma string e a callback com dois parametros? coisa básica de javascript mas não entendi essa lógica.
Pq o emit é passado com 3 parametros, no caso, duas strings, e uma callback, e no servidor o on recebe só uma string e a callback com dois parametros? coisa básica de javascript mas não entendi essa lógica.
Oi, Bruno, tudo bem?
Esse funcionamento é devido à logica interna dos métodos do Socket.IO. Ao utilizarmos socket.emit
, o primeiro parâmetro é sempre o nome do evento, e todos os parâmetros a partir do segundo serão os dados carregados pelo evento.
Já do outro lado da comunicação, ao utilizarmos o socket.on
, o primeiro parâmetro é sempre o nome do evento a ser escutado, e o segundo parâmetro é sempre uma função callback. Essa função callback recebe como parâmetros exatamente todos os dados que enviamos com socket.emit
.
Por exemplo, digamos que no front-end eu tenha o seguinte código:
socket.emit("dados_usuario", "Evaldo", 10, true);
Nesse código, além do nome do evento, passamos mais três parâmetros como dados do evento.
No lado do back-end, eu vou receber esses três parâmetros na função callback. Teremos o seguinte código:
io.on("connection", (socket) => {
socket.on("hello", (dado1, dado2, dado3) => {
console.log(dado1); // "Evaldo"
console.log(dado2); // 10
console.log(dado3); // true
});
});
Da mesma forma, algo semelhante acontece quando utilizamos o recurso de Reconhecimento do Socket.IO. Se passarmos uma função como dado do socket.emit
, podemos recebê-la do outro lado da comunicação, como um parâmetro da função callback.
Então, como na atividade, eu posso executar socket.emit
no front-end passando três parâmetros: o nome do evento "nome_usuario"
, um dado "Evaldo"
, e mais um dado, que é uma função callback. Usamos o código a seguir:
socket.emit("nome_usuario", "Evaldo", (dadosUsuario) => {
console.log(dadosUsuario);
});
E, do lado do back-end, o primeiro parâmetro de socket.on
será o nome do evento, e o segundo será uma função callback que recebe os dois parâmetros restantes enviados pelo socket.emit
: a string "Evaldo"
e a função callback do front-end. Utilizamos o seguinte código:
io.on("connection", (socket) => {
socket.on("nome_usuario", (nome, devolverDados) => {
const dadosUsuario = obterDadosUsuario(nome);
devolverDados(dadosUsuario);
});
});
Entretando, é importante ressaltar que só é possível enviar uma função de um lado da comunicação para o outro apenas quando ela é o último parâmetro do socket.emit
. Isso também é um critério estabelecido pelo próprio Socket.IO. Ao fazer isso, ele entende que você está querendo utilizar o recurso de Reconhecimento.
Espero ter ajudado! Abraços e bons estudos :)