[英]How to managed multiple emit event using socket.io in javascript
I've made a demo app to understand how socket.io 'emit' works.我制作了一个演示应用程序来了解 socket.io 'emit' 的工作原理。 In client file I have defined a function that emit some value to server and this function is call in loop 5 times and server job is to return that value back to client.在客户端文件中,我定义了一个 function ,它向服务器发出一些值,这个 function 被循环调用 5 次,服务器工作是将该值返回给客户端。
My web client: client.html我的 web 客户端:client.html
var socket = io('http://127.0.0.1:8586', {transports: ['websocket']});
function test2( dataSend ){
console.log("FUNCTION 'test2()' loop test - > emit to SRV: " + dataSend);
socket.emit('emitFromClient', dataSend);
socket.on('feedback_emitFromClient', function (data) { // listen to news event raised by the server
console.log("Received data from server: " + JSON.stringify(data)); //+ " || typeof: " + typeof data["result"]);
});
}
for (var i = 1; i <= 5; i++)
test2(i);
NodeJS server app: server.js NodeJS 服务器应用程序:server.js
const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
app.use(express.static('socketTest1'));
const io = require('socket.io')(server);//, { origins: '*:*'});
io.sockets.on('connection', function(socket){
console.log('a user connected!');
var socketId = socket.id;
var clientIp = socket.request.connection.remoteAddress;
console.log("clientIp: " + clientIp + " || socketId: " + socketId);
socket.on('emitFromClient', function (data) {
console.log("debug - received event (emitFromClient) from client, socket id: " + socket.id + " || value: " + data );
let ts = Date.now();
console.log("debug - send data from SRV to client -> data: " + data);
socket.emit('feedback_emitFromClient', { result: Math.floor(ts/1000), data: data }); // Send data to client
});
server.listen(8586, '127.0.0.1', function(){
console.log('listening on *:8586');
});
In actual state I've received in console client something like that:在实际的 state 中,我在控制台客户端收到了类似的内容:
First, all emit events are done and then are displayed all data from server
> EMIT event 1 from CLIENT, value: 1
> EMIT event 2 from CLIENT, value: 2
..................................
> EMIT event 5 from CLIENT, value: 5
< Received data from server, value: 1
< Received data from server, value: 2
........................................
< Received data from server, value: 5
I want to modified this demo to work like this, after every single emit event to received an answer from server我想修改这个演示,使其像这样工作,在每个发出事件后从服务器接收到答案
> EMIT event 1 from CLIENT, value: 1
< Received data from server, value: 1
> EMIT event 2 from CLIENT, value: 2
< Received data from server, value: 2
Can anyone explain to me what I did wrong?谁能向我解释我做错了什么?
You did nothing wrong, you just expect a wrong thing.你没有做错什么,你只是期待一个错误的事情。 You send all data at the same time您同时发送所有数据
for (var i = 1; i <= 5; i++)
test2(i);
Thats why you see the log这就是你看到日志的原因
> EMIT event 1 from CLIENT, value: 1
> EMIT event 2 from CLIENT, value: 2
..................................
> EMIT event 5 from CLIENT, value: 5
Because you are not waiting to the response to send the next.因为您没有等待响应发送下一个。
If you want to wait for the response you should write something like:如果您想等待响应,您应该编写如下内容:
var testTosend;
var testSent;
function emit(testSent){
console.log("FUNCTION 'test2()' loop test - > emit to SRV: " + testSent);
socket.emit('emitFromClient', testSent);
testSent++;
}
function test2( dataSend , times){
testTosend=times;
emit(dataSend)
socket.on('feedback_emitFromClient', function (data) { // listen to news event raised by the server
if(testTosend>testSent) emit(dataSend);
console.log("Received data from server: " + JSON.stringify(data)); //+ " || typeof: " + typeof data["result"]);
});
}
test2(5);
But a better way to do this is to save a timestamp and order all the messages dependending of this date before showing them.但更好的方法是保存时间戳,并在显示之前对所有依赖于该日期的消息进行排序。
Synchrony is complex =)同步很复杂 =)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.