2016-06-17 3 views
2

sperren Wenn ich ein globales Array haben:Wie ein globales Array in socket.io

var users = new Array(); 

Und ich möchte dieses Array unter allen meinen Kunden halten:

socket.on('connect', function() { 
    users.push(socket.id); 
}); 

socket.on('disconnect', function() { 
    users.splice(users.indexOf(socket.id), 1); 
}); 

Was, wenn ich Eine weitere Funktion:

socket.on('new_score', function(s) { 
    for (u in users) { 
     ... 
     do some processing 
     ... 

     io.sockets.connected[users[u]].emit('new_score', socket.id, s); 

     ... 
     do some processing 
     ... 
    } 
}); 

Da socket.io asynchron ist, von der Zeit, die ich in dieser letzten Funktion emittieren nennen, kann der Benutzer in disconnect gelöscht wurden .

Also muß ich einen Weg, um sicher die Array Zugriff mit all diesen anderen Funktionen asynchron zu manipulieren ...

+0

Es hängt davon ab, was _ "einige Verarbeitung" bedeutet eigentlich. – robertklep

+0

, d. H. Es tut etwas, das eine Weile dauert, bis es fertig ist. – lombrozo

+0

Bedeutet das, dass die Verarbeitung asynchron ist? – robertklep

Antwort

2

Wenn die gesamte for Schleife synchron ist (oder hängt nicht von Ergebnissen von Asynchron-Funktionen), Sie habe nichts zu befürchten.

Die gesamte Schleife wird in demselben "Tick" verarbeitet und alle Nachrichten (wie disconnect) werden am Ende des Ticks behandelt.

+0

Würde es nicht bedeuten, dass der Benutzer, selbst wenn der Server die Verbindung unterbrochen hat, während der Server zum Beispiel die for-Schleife verarbeitete, trotzdem das Ereignis in For-Schleife sendet? Wenn das wahr ist, würde das nicht ein Problem verursachen? –

+0

@AkashAggarwal Das Problem, auf das sich das OP bezieht, hat mit dem Zugriff auf das Array 'users' zu tun, über das sie sich keine Gedanken machen sollten (_iff_ die Schleife ist synchron). Natürlich kann ein Benutzer in der Zwischenzeit die Verbindung trennen, aber dies ändert nicht das Array "Benutzer" während der Schleife (nur danach). Emiting kann dazu führen, dass der Server bemerkt, dass der Benutzer nicht mehr verbunden ist, aber das wird auch kein großes Problem sein ("socket.io" wird das handhaben). – robertklep

+0

Danke, ich frage mich, ob socket.io den Server zum Absturz bringen wird. Bis Sie gehen! –