socket nodejs node metodos examples javascript node.js socket.io

javascript - nodejs - socket.io: devolución de llamada emitir del lado del cliente nunca dispara



socket io socket io js (3)

Juguetándolo con socket.io solo como prueba de concepto, todo está funcionando bien hasta ahora, excepto que no puedo hacer que mi devolución de llamada funcione en el lado del cliente. Tengo que estar perdiendo algo estúpido aquí, pero la documentación no es asesina en este momento. El servidor toma el evento "getSomeData" bien, sin errores en ningún lado.

Por lo que pude decir en la fuente socket.io del cliente, comprueba si el último argumento para emitir es una función y siempre lo usa como una devolución de llamada, pero la depuración más profunda que esa fue problemática para mí.

Siento que me falta un concepto básico aquí ... ¿No es esto lo que this.send(..) se supone que debe hacer? Pude encontrar solo 1 uso en las aplicaciones de ejemplo, y ninguna donde el código del lado del cliente para la emisión de ese evento estaba disponible.

Actualización : solo para ser claro, de hecho estoy emitiendo intencionalmente el lado del cliente del evento. El propósito de esto era ver si socket.io se podía usar para permitir a los clientes extraer datos a petición además de recibir impulsos.

servidor:

var io = require(''socket.io'').listen(80); io.sockets.on(''connection'', function (socket) { socket.on("getSomeData", function() { this.send({data: "some random data"}); }); });

cliente: (console.log nunca sucede)

<script type="text/javascript" src="http://localhost/socket.io/socket.io.js"></script> <script type="text/javascript"> var socket = io.connect(''http://localhost''); socket.emit("getSomeData", function(data) { console.log(data); }); </script>


Parece que tienes un poco de lógica cambiada, intenta ...

var io = require(''socket.io'').listen(80); io.sockets.on(''connection'', function (socket) { socket.emit("getSomeData",{data: "some random data"}); });

y cliente ...

<script src="http://localhost/socket.io/socket.io.js"></script> <script> var socket = io.connect(''http://localhost''); socket.on("getSomeData", function(data) { console.log(data); }); </script>

EDITAR:

var io = require(''socket.io'').listen(80); io.sockets.on(''connection'', function (socket) { socket.on("getSomeData", function(name,fn) { fn({data: "some random data"}); }); });

Cliente

<script src="http://localhost/socket.io/socket.io.js"></script> <script> var socket = io.connect(''http://localhost''); socket.emit("getSomeData", function(data) { console.log(data); }); </script>


En la respuesta de Liam William, encontré que era necesario enviar la devolución de llamada (o función de reconocimiento) como el tercer argumento en el cliente emitir:

Cliente:

<script src="http://localhost/socket.io/socket.io.js"></script> <script> var socket = io.connect(''http://localhost''); socket.emit("getSomeData", null, function(data) { console.log(data); });


Puedes tener la devolución de llamada, pero tienes que hacerlo de forma un poco diferente:

Servidor: (app.js)

var io = require(''socket.io'')(80); io.on(''connection'', function (socket) { // please note that server will take 2 data entries as function parameter below socket.on(''ferret'', function (name, fn) { fn(''woot''); }); });

Cliente (index.html)

var socket = io(); // TIP: io() with no args does auto-discovery socket.on(''connect'', function () { socket.emit(''ferret'', ''tobi'', function (data) { console.log(data); // data will be ''woot'' }); });

Actaully, socket io también menciona este; sending-and-getting-data- (reconocimientos)