Contenu connexe Similaire à Javascript assíncrono: event loop, callbacks e promises Similaire à Javascript assíncrono: event loop, callbacks e promises (20) Javascript assíncrono: event loop, callbacks e promises2. @cezinha_anjos
• Programo há 25 anos, sendo
que já passei por diversas
linguagens e paradigmas de
programação.
• Estou atualmente focado em
tecnologias web,
principalmente em Ruby on
Rails e Javascript.
• Amante de OO, Clean Code,
Design Patterns, BDD e Lean.
• Sou diretor da ASSEINFO.
2
6. Por que a execução não
para e aguarda o
setTimeout?
6
7. Por que o setTimeout de
1 seg. retornou antes do
de 2seg.?
7
13. Bloqueante
var start = new Date();
!
for(var i = 0; i < 100000000; i++) { };
for(var i = 0; i < 100000000; i++) { };
!
console.log(new Date() - start, “ms");
# 545 ms
13
14. Não bloqueante
var start = new Date();
!
setTimeout(function() {
for(var i = 0; i < 100000000; i++) { };
}, 0);
!
setTimeout(function() {
for(var i = 0; i < 100000000; i++) { };
}, 0);
!
console.log(new Date() - start, “ms");
# 11 ms
14
15. De 545 ms para 11 ms?
Será que rodou tudo?
15
16. var start = new Date(), count = 0;
setTimeout(function() {
for(var i = 0; i < 100000000; i++) { }; count++;
}, 0);
!
setTimeout(function() {
for(var i = 0; i < 100000000; i++) { }; count++
}, 0);
!
console.log(new Date() - start, “ms”);
console.log(count, “ocorrências”);
# 11 ms
# 0 ocorrências
————————————————
console.log(count, “ocorrências”);
# 2 ocorrências
16
19. Um callback é a maneira mais básica de
ser notificado sobre um retorno
assíncrono.
19
26. Somente elementos que implementem o
padrão Observer permitem mais de um
callback.
!
O event loop só responde a um
callback.
26
30. 30
var deferred = $.Deferred();
!
deferred.done(function(){
console.log(“Deferido");
});
!
deferred.fail(function(){
console.log(“Indeferido");
});
!
deferred.always(function(){
console.log(“Sempre");
});
deferred.resolve();
Deferido
Sempre
!
!
deferred.reject();
Indeferido
Sempre
Saída do console
32. Promise é um subset de deferred. A
diferença entre eles é que promise não
possui os métodos resolve() e reject()
32
34. 34
var response = $.ajax({
url: “/person.json”,
data: {id: 1},
dataType: “json”
});
!
response.always(function(){
console.clear();
});
!
response.done(function(person){
console.log(person);
});
!
response.fail(function(){
console.log(“Person not found");
});
36. 36
var response = $.ajax({
url: “/person.json”,
data: {id: 1},
dataType: “json”
});
!
response.reject();
!
response.always(function(){
console.clear();
});
!
response.done(function(person){
console.log(person);
});
!
response.fail(function(){
console.log(“Person not found");
});
por isso!
38. 38
function sayMyName(name) {
var deferred = $.Deferred();
!
if (name === “Heisenberg”) {
deferred.resolve();
} else {
deferred.reject();
}
!
return deferred.promise();
}
!
sayMyName(“Jesse Pinkman”)
.always(function(){ console.clear(); })
.done(function(){ console.log(“You know my name!”); })
.fail(function(){ console.log(“It’s better call Saul!”); })
;