При написании простого события:
const EventEmitter = require('events');
let myEmitter = new EventEmitter();
myEmitter.on('aaa', (d) => {
let ii = 1;
console.log('функция начала выполняться');
setImmediate(() => {
for (let i = 1; i < 1000000000; i++) {
ii = ii * i;
}
console.log(d);
});
console.log('функция выполнилась');
});
myEmitter.emit('aaa', 1);
myEmitter.emit('aaa', 2);
myEmitter.emit('aaa', 3);
Результат выводится асинхронно:
функция выполнилась
функция начала выполняться
функция выполнилась
функция начала выполняться
функция выполнилась
1
2
3
Но в сокетах событие 'data' обрабатывается синхронно, следующее событие не начинает выполняться, пока не завершится предыдущее событие:
const net = require('net');
const fs = require('fs');
const UNIX_DOMAIN_PATH = '/tmp/sockets';
try{
fs.unlinkSync(UNIX_DOMAIN_PATH + '/test.sock');
} catch (err) {}
const server = net.createServer();
server.on('connection', handleConnection);
server.listen(UNIX_DOMAIN_PATH + '/test.sock');
function handleConnection(conn) {
console.log('new client connection');
let i = 0;
conn.on('data', (d) => {
i++;
console.log('i = ' + i);
setImmediate(() => {
let ii = 1;
console.log('функция начала выполняться');
console.log(d);
for (let i = 1; i < 1000000000; i++) {
ii = ii * i;
}
console.log('функция выполнилась');
});
console.log('end');
});
conn.once('close', onConnClose);
conn.on('error', onConnError);
function onConnClose() {
console.log('connection closed');
}
function onConnError(err) {
console.log('Connection error: %s', err.message);
}
}
Результат при отправке на сокет
nc -U /tmp/sockets/test.sock
данных:
new client connection
i = 1
end
функция начала выполняться
<Buffer 31 0a>
функция выполнилась
i = 2
end
функция начала выполняться
<Buffer 31 0a>
функция выполнилась
Как обрабатывать события асинхронно?