Node.js - Loop de eventos
Node.js é um aplicativo de thread único, mas pode suportar simultaneidade por meio do conceito de event e callbacks. Cada API do Node.js é assíncrona e de thread único, eles usamasync function callspara manter a simultaneidade. O Node usa o padrão do observador. A thread do nó mantém um loop de eventos e sempre que uma tarefa é concluída, ela dispara o evento correspondente que sinaliza a execução da função de ouvinte de eventos.
Programação Orientada a Eventos
O Node.js usa eventos intensamente e também é um dos motivos pelos quais o Node.js é muito rápido em comparação com outras tecnologias semelhantes. Assim que o Node inicia seu servidor, ele simplesmente inicia suas variáveis, declara funções e então simplesmente espera que o evento ocorra.
Em um aplicativo orientado a eventos, geralmente há um loop principal que escuta os eventos e aciona uma função de retorno de chamada quando um desses eventos é detectado.
Embora os eventos sejam bastante semelhantes aos retornos de chamada, a diferença está no fato de que as funções de retorno de chamada são chamadas quando uma função assíncrona retorna seu resultado, enquanto o tratamento de eventos funciona no padrão do observador. As funções que ouvem os eventos agem comoObservers. Sempre que um evento é disparado, sua função de ouvinte começa a ser executada. O Node.js tem vários eventos embutidos disponíveis por meio do módulo de eventos e da classe EventEmitter que são usados para vincular eventos e ouvintes de eventos da seguinte maneira -
// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();
A seguir está a sintaxe para vincular um manipulador de eventos a um evento -
// Bind event and event handler as follows
eventEmitter.on('eventName', eventHandler);
Podemos disparar um evento programaticamente da seguinte maneira -
// Fire an event
eventEmitter.emit('eventName');
Exemplo
Crie um arquivo js chamado main.js com o seguinte código -
// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();
// Create an event handler as follows
var connectHandler = function connected() {
console.log('connection succesful.');
// Fire the data_received event
eventEmitter.emit('data_received');
}
// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);
// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function() {
console.log('data received succesfully.');
});
// Fire the connection event
eventEmitter.emit('connection');
console.log("Program Ended.");
Agora vamos tentar executar o programa acima e verificar sua saída -
$ node main.js
A TI deve produzir o seguinte resultado -
connection successful.
data received successfully.
Program Ended.
Como funcionam os aplicativos do Node?
No aplicativo Node, qualquer função assíncrona aceita um retorno de chamada como o último parâmetro e uma função de retorno de chamada aceita um erro como o primeiro parâmetro. Vamos revisitar o exemplo anterior novamente. Crie um arquivo de texto denominado input.txt com o seguinte conteúdo.
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
Crie um arquivo js chamado main.js com o seguinte código -
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) {
console.log(err.stack);
return;
}
console.log(data.toString());
});
console.log("Program Ended");
Aqui fs.readFile () é uma função assíncrona cujo propósito é ler um arquivo. Se ocorrer um erro durante a operação de leitura, oerr object conterá o erro correspondente, caso contrário, os dados conterão o conteúdo do arquivo. readFile passa err e dados para a função de retorno de chamada após a conclusão da operação de leitura, que finalmente imprime o conteúdo.
Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!