Skip to content

Commit df465ee

Browse files
Conteúdo Módulo IV - Aplicando conceitos Promises e Fetch
1 parent 760e529 commit df465ee

File tree

2 files changed

+270
-9
lines changed

2 files changed

+270
-9
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

readme.md

+269-9
Original file line numberDiff line numberDiff line change
@@ -509,25 +509,285 @@ for (let value of obj) {
509509

510510
## Módulo IV - Aplicando conceitos Promises e Fetch
511511

512-
### Aula I - Introdução a Promises e Fetch
512+
### Aula I - Callbacks e Promises
513513

514-
### Aula II - Callbacks e Promises
514+
#### Callbacks
515515

516-
### Aula III - Fetch, Async/Await e EventEmitter
516+
- No javascript é comum usar funções de callback para executar algo após alguma tarefa assíncrona ter sido executada.
517+
518+
```javascript
519+
// callback
520+
// maneira tradicional de callback
521+
function doSomething(callback) {
522+
setTimeout(function() {
523+
// did something
524+
callback('First data');
525+
}, 1000);
526+
}
527+
528+
function doOtherThing(callback) {
529+
setTimeout(function() {
530+
// did other thing
531+
callback('Second data');
532+
}, 1000);
533+
}
534+
535+
// execução de maneira sequencial das funções com callback (callback hell)
536+
function doAll() {
537+
try {
538+
doSomething(function(data) {
539+
var processedData = data.split('');
540+
try {
541+
doOtherThing(function(data) {
542+
var processedData2 = data.split('');
543+
try {
544+
setTimeout(function() {
545+
console.log(processedData, processedData2)
546+
}, 1000);
547+
});
548+
} catch(err) {
549+
// handle error
550+
}
551+
} catch(err) {
552+
// handle error
553+
}
554+
});
555+
} catch(err) {
556+
// handle error
557+
}
558+
}
559+
560+
// chamando as funções
561+
doAll();
562+
```
563+
564+
#### Promises
565+
566+
```javascript
567+
new Promise((resolve, reject) => {})
568+
```
569+
570+
- Um objeto promise guarda a promessa de que a função que gerou ele irá em algum momento no futuro terminar e te retornar um resposta.
571+
- Ela pode ser uma resposta positiva ou negativa. O promise pode ser passado para outras funções ou retornado.
572+
- Para evitar os diversos callback usamos promises.
573+
- Os estados de uma promises são:
574+
- Pending: Quando está em execução
575+
- Fulfilled: Quando terminou de executar
576+
- Rejected: Quando ocorreu algum erro
577+
- Para tratar os erros usamos o método .catch que irá receber uma função para o tratamento
578+
- Promise.race: cria uma Promise contendo diversas Promise e trazer o retorno da primeira que resolver entre elas.
579+
- Promise.all: Processa múltiplas Promise de maneira paralela e tratar o retorno de todas posteriormente
580+
581+
```javascript
582+
// Promises
583+
const doSomethingPromise = () =>
584+
new Promise((resolve, reject) => {
585+
// simulando retorno de erro
586+
// throw new Error('something went error');
587+
588+
setTimeout(function() {
589+
// did something
590+
resolve('First data');
591+
}, 1000);
592+
});
593+
594+
const doOtherThingPromise = () =>
595+
new Promise((resolve, reject) => {
596+
// simulando retorno de erro
597+
// throw new Error('otherthing went error');
598+
599+
setTimeout(function() {
600+
// did other thing
601+
resolve('Second data');
602+
}, 1000);
603+
});
604+
605+
// chamando as funções sequencialmente
606+
doSomethingPromise()
607+
.then(data => {
608+
console.log(data.split(''));
609+
return doOtherThingPromise();
610+
}) // sequenciando a segunda promisse para ser executada após a primeira
611+
.then(data2 => console.log(data2.split('')))
612+
.catch(error => console.log('Ops', error));
613+
614+
615+
// chamando as funções em paralelo e realizando algo após a execução de ambas
616+
Promise.all([doSomethingPromise(), doOtherThingPromise()])
617+
.then(data => {
618+
console.log(data[0].split(''));
619+
console.log(data[1].split(''));
620+
})
621+
.catch(error => console.log('Ops', error));
622+
623+
// Executando todas as promises, mas retornando a primeira que conseguir resolver
624+
Promise.race([doSomethingPromise(), doOtherThingPromise()])
625+
.then(data => {
626+
console.log(data);
627+
})
628+
.catch(error => console.log('Ops', error));
629+
```
630+
631+
### Aula II - Fetch, Async/Await e EventEmitter
632+
633+
#### Fetch
634+
635+
- fetch só irá disparar um erro caso aconteça um erro de rede e não seja possível realizar a requisição.
636+
- O retorno da invocação da função fetch é uma Promise.
637+
638+
```json
639+
{
640+
"data": [1, 2, 3]
641+
}
642+
```
643+
644+
```javascript
645+
// exibe no catch apenas erros de rede
646+
// retorno do fetch é uma promise
647+
fetch('/data.json')
648+
.then(responseStream => {
649+
if (responseStream.status === 200) {
650+
return responseStream.json()
651+
} else {
652+
throw new Error('Request error')
653+
}
654+
})
655+
.then(data => console.log(data))
656+
.catch(error => {
657+
console.log('Erro: ', error)
658+
});
659+
```
660+
661+
#### Async/Await
662+
663+
- Async: Uma forma de criar promises mais fácil
664+
- Await: A palavra reservada await pode ser usada dentro de uma função criada utilizando a palavra async e para aguardar a resolução de uma promise.
665+
666+
```javascript
667+
const simpleFunc = async () => {
668+
// throw new Error('Error')
669+
return 12345;
670+
}
671+
672+
simpleFunc()
673+
.then(data => {
674+
console.log(data)
675+
})
676+
.cathc(error => {
677+
console.log(error);
678+
})
679+
680+
// promise para teste de await
681+
const asyncTime = () =>
682+
new Promise((resolve, reject) => {
683+
setTimeout(function() {
684+
resolve(123456);
685+
}, 1000);
686+
});
687+
688+
const simpleAsyncTime = async () => {
689+
const data = await asyncTime();
690+
return data;
691+
}
692+
693+
// processamento assincrono como se fosse sincrono com o await
694+
const simpleAsyncFetch = async () => {
695+
const data = await asyncTime();
696+
console.log(data);
697+
698+
const dataJson = await fetch('/data.json')
699+
.then(responseStream => {
700+
if (responseStream.status === 200) {
701+
return responseStream.json()
702+
} else {
703+
throw new Error('Request error')
704+
}
705+
})
706+
.then(data => console.log(data))
707+
.catch(error => {
708+
console.log('Erro: ', error)
709+
});
710+
return dataJson;
711+
}
712+
713+
// usando promise.all, para executar em paralelo
714+
const simpleAsyncFetch = async () => {
715+
const data = await Promise.all([
716+
asyncTime(),
717+
fetch('/data.json')
718+
.then(responseStream => {
719+
if (responseStream.status === 200) {
720+
return responseStream.json()
721+
} else {
722+
throw new Error('Request error')
723+
}
724+
})
725+
.then(data => console.log(data))
726+
.catch(error => {
727+
console.log('Erro: ', error)
728+
});
729+
]);
730+
731+
return data;
732+
}
733+
```
517734
518735
### Aula III - Aplicando e praticando os conceitos
519736
520-
## Módulo V - Conceitos aplicados a qualidade de código e automação de testes em JS
737+
### EventEmitter
738+
739+
- Programação assíncrona com o node
740+
- A diferença entre o método on e once de uma instância EventEmitter é que um subscreve uma função a todas as ocorrências de um evento, o outro apenas para a primeira ocorrência.
741+
742+
```javascript
743+
//node-script.js
744+
// Instanciar ou extender o events
745+
const EventEmitter = require('events');
521746

522-
### Aula I - Introdução e conceitos da aula
747+
const emitter = new EventEmitter();
748+
749+
emitter.on('User logged', data => {
750+
console.log(data);
751+
});
752+
753+
emitter.emit('User logged', { user: 'Daniel' });
754+
755+
// execute
756+
// server node node-script.js
757+
```
758+
759+
```javascript
760+
//node-script.js
761+
const EventEmitter = require('events');
762+
763+
// class, extendendo e simplificando
764+
class Users extends EventEmitter {
765+
userLogged(data) {
766+
this.emit('User logged', data);
767+
}
768+
}
769+
770+
const users = new Users();
771+
772+
users.on('User logged', data => {
773+
console.log(data);
774+
});
775+
776+
users.userLogged({ user: 'Daniel' });
777+
778+
// execute
779+
// server node node-script.js
780+
```
781+
782+
## Módulo V - Conceitos aplicados a qualidade de código e automação de testes em JS
523783
524-
### Aula II - Testes, TDD e BDD
784+
### Aula I - Testes, TDD e BDD
525785
526-
### Aula III - Conheça Mocha, Chai e Sinon
786+
### Aula II - Conheça Mocha, Chai e Sinon
527787
528-
### Aula IV - Veja como traballha com Chai
788+
### Aula II - Veja como traballha com Chai
529789
530-
### Aula V - Desenvolvendo códigos com Sinon
790+
### Aula IV - Desenvolvendo códigos com Sinon
531791
532792
## Módulo VI - Tratamento e exceções
533793

0 commit comments

Comments
 (0)