2016-06-17 4 views
2

Когда излучатель принят на SERVER (то есть сгенерирован клиентом), выполняет ли функция обратного вызова до следующего следующего испускания?Являются ли socket.io SERVER испускать обратные вызовы?

Пример:

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

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

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

Кажется, я получаю этот выход в моем журнале:

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

Как вы можете видеть, START прерывает другой до конца достигается ...

+0

_If_ _ «Сделайте что-нибудь» _ выполняет некоторые действия async .. – Rayon

+0

Что такое «асинхронные действия»? – lombrozo

+0

Все, что выполняется асинхронно .... – Rayon

ответ

0

Функция обратного вызова вызывается каждый раз, когда вызывается функция on().

NodeJS работает асинхронно и неблокирует ввод-вывод. Таким образом, когда 3-й этап START завершен, на консоли ожидается соответствующий END.

Но Node.JS перескакивает вперед по коду, по мере того как END все еще обрабатывает, для вызова обратного вызова и печати следующего START на консоли, а когда завершающая обработка END завершена, она отображается на консоли.

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

Так что мне нужно добавить блокировки вокруг всего моего кода? – lombrozo

+0

Да. Если вы хотите контролировать поток в своем коде, тогда вам нужно. –

+0

Какие блокирующие блоки можно использовать в JavaScript? – lombrozo

2

Socket.io прилипает к основному принципу цикла событий на основе выполнения асинхронного кода, где каждый из ваших испускают и на обратных вызовов получить выполняется, когда событие с определенным именем было испускается и/или слушать ,

И поскольку эти события не поручился последовательного исполнения, если иное такие меры принимаются в сам код

//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' }); 
    }); 

Приведенный выше код гарантирует, что «синхронным событие» событие на стороне клиента выполняется после «First_Event» прослушивается клиентом.

Также обратите внимание, что событие 1 & 2 может быть выполнено в любом порядке независимо от их вызывающей последовательности на стороне клиента.

//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' });