简体   繁体   English

如何在 javascript 中使用 socket.io 管理多个发射事件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM