@rail-ka
Программист.

Как асинхронно обрабатывать полученные данные сокетом? Event 'data' — не асинхронный?

При написании простого события:
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>
функция выполнилась

Как обрабатывать события асинхронно?
  • Вопрос задан
  • 128 просмотров
Пригласить эксперта
Ответы на вопрос 2
doniys_a
@doniys_a
Backend-разработчик (Php, node.js, python, ruby)
Может, промисы помогут ?
Вот пример реализации
Ответ написан
Комментировать
@bublik462
Веб программист - самоучка .
вообще то nodejs асинхронный движок.
какой результат вы хотите получит ? на выходе .
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы