2016-06-17 2 views
2

Wenn eine Ausgabe auf dem SERVER empfangen wird (d. H. Von einem Client generiert wird), wird die Rückruffunktion abgeschlossen, bevor die nächste Ausgabe verarbeitet wird?Sind socket.io SERVER Callbacks blockiert?

Beispiel:

socket.on('disconnect', function() { 
    log('disconnect START - ' + socket.id); 

    ... 
    ... 
    Do some stuff 
    ... 
    ... 

    log('disconnect END - ' + socket.id); 
}); 

Ich scheine diese Ausgabe in meinem Protokoll zu bekommen:

disconnect START - z0w0W4scKZ8o6c4nAAAm 
disconnect END - z0w0W4scKZ8o6c4nAAAm 
disconnect START - LLnSgRBV9NZ35mjrAAAk 
disconnect START - djl3hyNvIwAhSEDbAAAn 
disconnect END - LLnSgRBV9NZ35mjrAAAk 
disconnect END - djl3hyNvIwAhSEDbAAAn 

Wie Sie sehen können, ein START unterbricht eine weitere vor dem Ende erreicht ist ...

+0

_If_ _ "ein paar Sachen tun" _ hat einige Asynchron-Aktivitäten .. – Rayon

+0

Was sind 'Asynchron-Aktivitäten'? – lombrozo

+0

Alles was asynchron ausgeführt wird .... – Rayon

Antwort

0

Die Callback-Funktion wird jedes Mal aufgerufen, wenn on() aufgerufen wird.

NodeJS wird asynchron ausgeführt und ist nicht blockierende E/A. Wenn also der 3. START beendet ist, wird das entsprechende END auf der Konsole erwartet.

Aber Node.JS springt den Code vor, während das END noch verarbeitet, um den Rückruf aufzurufen und den nächsten START auf der Konsole zu drucken, und wenn das ENDE, das warten wurde, verarbeitet wird, wird es auf der Konsole angezeigt.

1 disconnect START - z0w0W4scKZ8o6c4nAAAm 
1 disconnect END - z0w0W4scKZ8o6c4nAAAm 
2 disconnect START - LLnSgRBV9NZ35mjrAAAk 
3 disconnect START - djl3hyNvIwAhSEDbAAAn 
2 disconnect END - LLnSgRBV9NZ35mjrAAAk 
3 disconnect END - djl3hyNvIwAhSEDbAAAn 
+0

Also muss ich Schlösser um all meinen Code hinzufügen? – lombrozo

+0

Ja. Wenn Sie den Fluss in Ihrem Code steuern möchten, müssen Sie dies tun. –

+0

Welche blockierenden Sperren kann ich in JavaScript verwenden? – lombrozo

2

Socket.io klebt an das Grundprinzip der Ereignisschleife asynchronen Ausführung von Code basiert, wobei jedes Ihrer und auf Rückrufe emittieren ausgeführt werden, wenn das Ereignis mit spezifischen Namen und/oder angehört hat, ausgesendet worden ist .

Und da diese Ereignisse gibt keine Sicherheit sequentieller Ausführung ist, wenn nicht anders solche Anordnungen im Code gemacht werden selbst

//Server 
    //1. Emit this event 
    socket.emit('First_Event', { hello: 'world' }); 

    //2. Listen to this event 
    socket.on('Synchronous-Event', function (data) { 
    console.log(data); 
    }); 

    //Client 
    //1. Listen to this event 
    socket.on('First_Event', function (data) { 
    console.log(data); 
    //2.Then emit this event 
    socket.emit('Synchronous-Event', { my: 'data' }); 
    }); 

Der obige Code stellt sicher, dass die Ereignis ‚Synchronous-Ereignis‘ auf Seite führt Kunden nach dem 'First_Event' wird vom Client angehört.

Beachten Sie auch, dass das Ereignis 1 & 2 in beliebiger Reihenfolge ausgeführt werden kann, unabhängig von ihrer Aufrufsequenz auf der Clientseite.

//For Example **alternate** asynchronous event 
//Client 
     //1. Listen to this event 
     socket.on('First_Event', function (data) { 
     console.log(data); 
     }); 
     //2.Emit this event async* 
     socket.emit('Synchronous-Event', { my: 'data' });