SlideShare uma empresa Scribd logo
1 de 17
Baixar para ler offline
NodeJS
E/S n˜ao-bloqueante - Dirigido a Eventos
´Atila Camurc¸a
10 de junho de 2013
Sumary
1 Introduc¸˜ao
2 NodeJS
3 Emitindo eventos
4 E/S
Operac¸˜oes com arquivos
Introduc¸˜ao
Programas que usam E/S n˜ao-bloqueantes tendem a seguir a regra que
toda func¸˜ao deve retornar imediatamente.
Isso parece uma thread n˜ao?
Existem diferenc¸as. Vejamos um exemplo da vida real.
Recepcionista do m´edico
Doutor ´e quem tem doutorado
Imaginem uma fila na recepc¸˜ao de um consult´orio m´edico.
Recepcionista do m´edico
Doutor ´e quem tem doutorado
Para ser atendido o paciente precisa preencher 3 formul´arios.
Num mundo bloqueante o paciente preencheria os 3 formul´arios na
pr´opria recepc¸˜ao, fazendo com que a fila espere.
Usando outra thread (recepcionista) poder´ıamos resolver este problema?
Recepcionista do m´edico
Doutor ´e quem tem doutorado
Parcialmente, j´a que mesmo assim a fila deve esperar. Mas como fazer
com que a fila n˜ao precise esperar?
Recepcionista do m´edico
Doutor ´e quem tem doutorado
Enquanto um preenche o formul´ario, o outro ´e antendido. E assim por
diante. Dessa forma quando um paciente termina de preencher ele volta
a fila apenas para entregar o formul´ario e ser atendido em seguida.
NodeJS
Uma das formas de implementarmos esse comportamento em uma
linguagem de programac¸˜ao ´e usando NodeJS. Rodando em cima do
ambiente V8 do Google Chrome, NodeJS consegue trabalhar fora do
browser usando JavaScript.
Hello World
Instalac¸˜ao: $ sudo apt-get install nodejs
console.log("hello world.");
Salve como hello.js. Execute num terminal:
$ node hello.js
Emitindo eventos
var util = require(’util’),
EventEmitter = require(’events’).EventEmitter;
var Recepcionista = function() {
EventEmitter.call(this);
};
var Paciente = function() {
EventEmitter.call(this);
};
util.inherits(Paciente, EventEmitter);
util.inherits(Recepcionista, EventEmitter);
Emitindo eventos
Recepcionista.prototype.atender = function() {
console.log("Preencha o formul´ario.");
};
Paciente.prototype.preencher = function(recep, nome, t) {
setTimeout(function() {
recep.emit(’entregar’, {nome: nome});
}, t);
};
Emitindo eventos
var r = new Recepcionista();
r.on("entregar", function(dados) {
console.log("Ok Sr(a). " + dados.nome
+ ", vocˆe ser´a atendido.");
});
var p = new Paciente();
r.atender();
p.preencher(r, ’Mario’, 2500);
r.atender();
p.preencher(r, ’Luigi’, 1500);
r.atender();
p.preencher(r, ’Ozzy’, 2000);
Emitindo eventos
Veja a diferenc¸a na vaz˜ao.
E/S
Operac¸˜oes com arquivos
var fs = require(’fs’);
fs.readFile(’arq1.txt’, ’utf-8’, function(err, data) {
if (err) throw err;
console.log(data);
});
fs.unlink(’arq1.txt’, function (err) {
if (err) throw err;
console.log(’successfully deleted arq1.txt’);
});
Este trecho de c´odigo eventualmente ir´a funcionar como esperado. Isso
se fosse uma operac¸˜ao bloqueante, onde o m´etodo fs.unlink iria
esperar o m´etodo fs.readFile.
Operac¸˜oes com arquivos
Entretanto, estes m´etodos s˜ao ass´ıncronos e podem n˜ao funcionar como
esperado.
Ent˜ao como fazer para resolver isso? Utilize chamadas aninhadas.
var fs = require(’fs’);
fs.readFile(’arq1.txt’, function(e, data) {
if (!e) {
console.log(data);
fs.unlink(’arq1.txt’);
} else {
console.log(’ocorreu em erro ao ler.’);
}
});
Operac¸˜oes com arquivos
Outra opc¸˜ao ´e utilizar chamadas s´ıncronas do mesmo m´etodo.
var fs = require(’fs’);
var data = fs.readFileSync(’arq1.txt’,
{encoding: ’utf-8’});
console.log(data);
fs.unlink(’arq1.txt’);
http://nodejs.org/api/fs.html

Mais conteúdo relacionado

Destaque

Angular Nodejs e com mongolab
Angular Nodejs e com mongolabAngular Nodejs e com mongolab
Angular Nodejs e com mongolabWende Mendes
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Emerson Macedo
 
Método criado por paraense pode servir de base tecnológica para criar soluçõe...
Método criado por paraense pode servir de base tecnológica para criar soluçõe...Método criado por paraense pode servir de base tecnológica para criar soluçõe...
Método criado por paraense pode servir de base tecnológica para criar soluçõe...João Gabriel Lima
 
IoTizando com JavaScript
IoTizando com JavaScriptIoTizando com JavaScript
IoTizando com JavaScriptHeider Lopes
 
EasyTaxi e MongoDB - Showcase
EasyTaxi e MongoDB - ShowcaseEasyTaxi e MongoDB - Showcase
EasyTaxi e MongoDB - ShowcaseYuri Teixeira
 
GDG NodeJS Sem Segredos
GDG NodeJS Sem SegredosGDG NodeJS Sem Segredos
GDG NodeJS Sem SegredosCaio Cutrim
 
JavaScript 2.0 in Dreamweaver CS4
JavaScript 2.0 in Dreamweaver CS4JavaScript 2.0 in Dreamweaver CS4
JavaScript 2.0 in Dreamweaver CS4alexsaves
 
Equipe Origami City
Equipe Origami CityEquipe Origami City
Equipe Origami CityCEPMBB
 
Node js - O poder do JavaScript do lado do servidor
Node js  - O poder do JavaScript do lado do servidorNode js  - O poder do JavaScript do lado do servidor
Node js - O poder do JavaScript do lado do servidorRomulo Fagundes
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o NodejsCaio Cutrim
 
MEAN Full Stack JavaScript - TaSafoConf 2015
MEAN Full Stack JavaScript - TaSafoConf 2015MEAN Full Stack JavaScript - TaSafoConf 2015
MEAN Full Stack JavaScript - TaSafoConf 2015Kaio Valente
 
Guia utilização e desenvolvimento de aplicação no PaaS c9.io
Guia utilização e desenvolvimento de aplicação no PaaS c9.ioGuia utilização e desenvolvimento de aplicação no PaaS c9.io
Guia utilização e desenvolvimento de aplicação no PaaS c9.iomarcochella
 
Adwords Express: como anunciar?
Adwords Express: como anunciar?Adwords Express: como anunciar?
Adwords Express: como anunciar?Mateada
 
Mean Stack - Aplicações Web Modernas com MEAN
Mean Stack - Aplicações Web Modernas com MEANMean Stack - Aplicações Web Modernas com MEAN
Mean Stack - Aplicações Web Modernas com MEANJoão Gabriel Lima
 

Destaque (20)

Angular Nodejs e com mongolab
Angular Nodejs e com mongolabAngular Nodejs e com mongolab
Angular Nodejs e com mongolab
 
Hack Thursday - NodeJS
Hack Thursday - NodeJSHack Thursday - NodeJS
Hack Thursday - NodeJS
 
Express 4
Express 4Express 4
Express 4
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
 
Método criado por paraense pode servir de base tecnológica para criar soluçõe...
Método criado por paraense pode servir de base tecnológica para criar soluçõe...Método criado por paraense pode servir de base tecnológica para criar soluçõe...
Método criado por paraense pode servir de base tecnológica para criar soluçõe...
 
IoTizando com JavaScript
IoTizando com JavaScriptIoTizando com JavaScript
IoTizando com JavaScript
 
Node js
Node jsNode js
Node js
 
Jquery 2
Jquery 2Jquery 2
Jquery 2
 
No Llores
No LloresNo Llores
No Llores
 
EasyTaxi e MongoDB - Showcase
EasyTaxi e MongoDB - ShowcaseEasyTaxi e MongoDB - Showcase
EasyTaxi e MongoDB - Showcase
 
GDG NodeJS Sem Segredos
GDG NodeJS Sem SegredosGDG NodeJS Sem Segredos
GDG NodeJS Sem Segredos
 
JavaScript 2.0 in Dreamweaver CS4
JavaScript 2.0 in Dreamweaver CS4JavaScript 2.0 in Dreamweaver CS4
JavaScript 2.0 in Dreamweaver CS4
 
Equipe Origami City
Equipe Origami CityEquipe Origami City
Equipe Origami City
 
Node js - O poder do JavaScript do lado do servidor
Node js  - O poder do JavaScript do lado do servidorNode js  - O poder do JavaScript do lado do servidor
Node js - O poder do JavaScript do lado do servidor
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o Nodejs
 
MEAN Full Stack JavaScript - TaSafoConf 2015
MEAN Full Stack JavaScript - TaSafoConf 2015MEAN Full Stack JavaScript - TaSafoConf 2015
MEAN Full Stack JavaScript - TaSafoConf 2015
 
Guia utilização e desenvolvimento de aplicação no PaaS c9.io
Guia utilização e desenvolvimento de aplicação no PaaS c9.ioGuia utilização e desenvolvimento de aplicação no PaaS c9.io
Guia utilização e desenvolvimento de aplicação no PaaS c9.io
 
Adwords Express: como anunciar?
Adwords Express: como anunciar?Adwords Express: como anunciar?
Adwords Express: como anunciar?
 
Typescript ppt
Typescript pptTypescript ppt
Typescript ppt
 
Mean Stack - Aplicações Web Modernas com MEAN
Mean Stack - Aplicações Web Modernas com MEANMean Stack - Aplicações Web Modernas com MEAN
Mean Stack - Aplicações Web Modernas com MEAN
 

Semelhante a NodeJS - E/S não-bloqueante - Dirigido a Eventos

A explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo pretoA explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo pretoNando Vieira
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3Flávio Lisboa
 
Node.js: 5 razões para começar a utilizar
Node.js: 5 razões para começar a utilizarNode.js: 5 razões para começar a utilizar
Node.js: 5 razões para começar a utilizarFilipe Falcão
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015talkitbr
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesDavid Robert Camargo de Campos
 
Programação reativa com RxJava
Programação reativa com RxJavaProgramação reativa com RxJava
Programação reativa com RxJavaMateus Parente
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitRobinson Castilho
 

Semelhante a NodeJS - E/S não-bloqueante - Dirigido a Eventos (20)

Javascript
JavascriptJavascript
Javascript
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
Boas Práticas em jQuery
Boas Práticas em jQueryBoas Práticas em jQuery
Boas Práticas em jQuery
 
servlet-introducao
servlet-introducaoservlet-introducao
servlet-introducao
 
Aula de Node
Aula de NodeAula de Node
Aula de Node
 
RMI em Java
RMI em JavaRMI em Java
RMI em Java
 
Ajax em java
Ajax em javaAjax em java
Ajax em java
 
JavaScript
JavaScriptJavaScript
JavaScript
 
A explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo pretoA explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo preto
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3
 
Node.js: 5 razões para começar a utilizar
Node.js: 5 razões para começar a utilizarNode.js: 5 razões para começar a utilizar
Node.js: 5 razões para começar a utilizar
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015
 
Te servelts
Te serveltsTe servelts
Te servelts
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefes
 
Programação reativa com RxJava
Programação reativa com RxJavaProgramação reativa com RxJava
Programação reativa com RxJava
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnit
 

Mais de Átila Camurça

Software Livre: Além da filosofia
Software Livre: Além da filosofiaSoftware Livre: Além da filosofia
Software Livre: Além da filosofiaÁtila Camurça
 
Espionagem e Software Livre
Espionagem e Software LivreEspionagem e Software Livre
Espionagem e Software LivreÁtila Camurça
 
Onde o Software Livre pode te levar - Uma viagem ao mundo livre
Onde o Software Livre pode te levar - Uma viagem ao mundo livreOnde o Software Livre pode te levar - Uma viagem ao mundo livre
Onde o Software Livre pode te levar - Uma viagem ao mundo livreÁtila Camurça
 
Guia Aberto Android ed.2
Guia Aberto Android ed.2Guia Aberto Android ed.2
Guia Aberto Android ed.2Átila Camurça
 
Tradução de Aplicativos Livres
Tradução de Aplicativos LivresTradução de Aplicativos Livres
Tradução de Aplicativos LivresÁtila Camurça
 
Linux - Customização e Repositórios Off-line
Linux - Customização e Repositórios Off-lineLinux - Customização e Repositórios Off-line
Linux - Customização e Repositórios Off-lineÁtila Camurça
 
Linux - Instalação de Programas
Linux - Instalação de ProgramasLinux - Instalação de Programas
Linux - Instalação de ProgramasÁtila Camurça
 
Aplicativos - Ubuntu COMSOLiD
Aplicativos - Ubuntu COMSOLiDAplicativos - Ubuntu COMSOLiD
Aplicativos - Ubuntu COMSOLiDÁtila Camurça
 

Mais de Átila Camurça (12)

Ciência e Informática
Ciência e InformáticaCiência e Informática
Ciência e Informática
 
Software Livre: Além da filosofia
Software Livre: Além da filosofiaSoftware Livre: Além da filosofia
Software Livre: Além da filosofia
 
Espionagem e Software Livre
Espionagem e Software LivreEspionagem e Software Livre
Espionagem e Software Livre
 
Ubuntu COMSOLiD 6
Ubuntu COMSOLiD 6Ubuntu COMSOLiD 6
Ubuntu COMSOLiD 6
 
Árvores B
Árvores BÁrvores B
Árvores B
 
Onde o Software Livre pode te levar - Uma viagem ao mundo livre
Onde o Software Livre pode te levar - Uma viagem ao mundo livreOnde o Software Livre pode te levar - Uma viagem ao mundo livre
Onde o Software Livre pode te levar - Uma viagem ao mundo livre
 
Guia Aberto Android ed.2
Guia Aberto Android ed.2Guia Aberto Android ed.2
Guia Aberto Android ed.2
 
Ubuntu COMSOLiD 5
Ubuntu COMSOLiD 5Ubuntu COMSOLiD 5
Ubuntu COMSOLiD 5
 
Tradução de Aplicativos Livres
Tradução de Aplicativos LivresTradução de Aplicativos Livres
Tradução de Aplicativos Livres
 
Linux - Customização e Repositórios Off-line
Linux - Customização e Repositórios Off-lineLinux - Customização e Repositórios Off-line
Linux - Customização e Repositórios Off-line
 
Linux - Instalação de Programas
Linux - Instalação de ProgramasLinux - Instalação de Programas
Linux - Instalação de Programas
 
Aplicativos - Ubuntu COMSOLiD
Aplicativos - Ubuntu COMSOLiDAplicativos - Ubuntu COMSOLiD
Aplicativos - Ubuntu COMSOLiD
 

Último

ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfNatalia Granato
 

Último (6)

ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 

NodeJS - E/S não-bloqueante - Dirigido a Eventos

  • 1. NodeJS E/S n˜ao-bloqueante - Dirigido a Eventos ´Atila Camurc¸a 10 de junho de 2013
  • 2. Sumary 1 Introduc¸˜ao 2 NodeJS 3 Emitindo eventos 4 E/S Operac¸˜oes com arquivos
  • 3. Introduc¸˜ao Programas que usam E/S n˜ao-bloqueantes tendem a seguir a regra que toda func¸˜ao deve retornar imediatamente. Isso parece uma thread n˜ao? Existem diferenc¸as. Vejamos um exemplo da vida real.
  • 4. Recepcionista do m´edico Doutor ´e quem tem doutorado Imaginem uma fila na recepc¸˜ao de um consult´orio m´edico.
  • 5. Recepcionista do m´edico Doutor ´e quem tem doutorado Para ser atendido o paciente precisa preencher 3 formul´arios. Num mundo bloqueante o paciente preencheria os 3 formul´arios na pr´opria recepc¸˜ao, fazendo com que a fila espere. Usando outra thread (recepcionista) poder´ıamos resolver este problema?
  • 6. Recepcionista do m´edico Doutor ´e quem tem doutorado Parcialmente, j´a que mesmo assim a fila deve esperar. Mas como fazer com que a fila n˜ao precise esperar?
  • 7. Recepcionista do m´edico Doutor ´e quem tem doutorado Enquanto um preenche o formul´ario, o outro ´e antendido. E assim por diante. Dessa forma quando um paciente termina de preencher ele volta a fila apenas para entregar o formul´ario e ser atendido em seguida.
  • 8. NodeJS Uma das formas de implementarmos esse comportamento em uma linguagem de programac¸˜ao ´e usando NodeJS. Rodando em cima do ambiente V8 do Google Chrome, NodeJS consegue trabalhar fora do browser usando JavaScript.
  • 9. Hello World Instalac¸˜ao: $ sudo apt-get install nodejs console.log("hello world."); Salve como hello.js. Execute num terminal: $ node hello.js
  • 10. Emitindo eventos var util = require(’util’), EventEmitter = require(’events’).EventEmitter; var Recepcionista = function() { EventEmitter.call(this); }; var Paciente = function() { EventEmitter.call(this); }; util.inherits(Paciente, EventEmitter); util.inherits(Recepcionista, EventEmitter);
  • 11. Emitindo eventos Recepcionista.prototype.atender = function() { console.log("Preencha o formul´ario."); }; Paciente.prototype.preencher = function(recep, nome, t) { setTimeout(function() { recep.emit(’entregar’, {nome: nome}); }, t); };
  • 12. Emitindo eventos var r = new Recepcionista(); r.on("entregar", function(dados) { console.log("Ok Sr(a). " + dados.nome + ", vocˆe ser´a atendido."); }); var p = new Paciente(); r.atender(); p.preencher(r, ’Mario’, 2500); r.atender(); p.preencher(r, ’Luigi’, 1500); r.atender(); p.preencher(r, ’Ozzy’, 2000);
  • 13. Emitindo eventos Veja a diferenc¸a na vaz˜ao.
  • 14. E/S
  • 15. Operac¸˜oes com arquivos var fs = require(’fs’); fs.readFile(’arq1.txt’, ’utf-8’, function(err, data) { if (err) throw err; console.log(data); }); fs.unlink(’arq1.txt’, function (err) { if (err) throw err; console.log(’successfully deleted arq1.txt’); }); Este trecho de c´odigo eventualmente ir´a funcionar como esperado. Isso se fosse uma operac¸˜ao bloqueante, onde o m´etodo fs.unlink iria esperar o m´etodo fs.readFile.
  • 16. Operac¸˜oes com arquivos Entretanto, estes m´etodos s˜ao ass´ıncronos e podem n˜ao funcionar como esperado. Ent˜ao como fazer para resolver isso? Utilize chamadas aninhadas. var fs = require(’fs’); fs.readFile(’arq1.txt’, function(e, data) { if (!e) { console.log(data); fs.unlink(’arq1.txt’); } else { console.log(’ocorreu em erro ao ler.’); } });
  • 17. Operac¸˜oes com arquivos Outra opc¸˜ao ´e utilizar chamadas s´ıncronas do mesmo m´etodo. var fs = require(’fs’); var data = fs.readFileSync(’arq1.txt’, {encoding: ’utf-8’}); console.log(data); fs.unlink(’arq1.txt’); http://nodejs.org/api/fs.html