Olá, pessoal, tudo bem? Como eu disse no último post do Event Loop, parte 1, eu iria trazer algum exemplo para explicar melhor, na prática, o que acontece com o Event Loop. Vamos lá.
- Aqui temos um código que está mexendo diretamente com Futures (em breve terá o conteúdo mais aprofundado sobre Futures e async/await) e com nossas microtasks.
- O código pode parecer confuso, mas vamos destrinchar o que está acontecendo aqui. Primeiro, temos uma conta aritmética padrão que vai imprimir nossa multiplicação. Abaixo do
print(c)
, temos umascheduleMicrotask
. Qual você acha que vai executar primeiro? Se você viu a imagem na primeira parte, pode ver que ele executa primeiro omain()
, tudo que é síncrono e depois escuta a fila de microtasks e de eventos. Ou seja, tudo que for síncrono é executado primeiro dentro do event loop, então nossos doisprint()
serão executados. - Depois, temos nosso
scheduleMicrotask #1
que está solto dentro domain
. Ele vai ser executado após nossosprint()
e depois temos doisFuture
, um com delay e outro sem delay. OFuture
sem delay será executado primeiro, e aqui temos algo que é uma "pegadinha". Você pode ver que ele tem umscheduleMicrotask
dentro e pode pensar que essa microtask vai ser executada primeiro. Mas não! Por quê? Porque oFuture
vai passar pela função anônima primeiro, que é oprint("future #2")
, e depois vai executar o callback dele que está nothen()
. E aqui, não importa a ordem dascheduleMicrotask
, ela sempre vai ser executada por último dentro de um Future, porque o event loop vai vê-la e vai agendá-la e depois que oFuture
terminar de executar ele dispara a fila de microtask. - E nosso proximo carinha é o
Future.delayed()
, que nesse tempo de explicação ele acabou de terminar. Aqui vai acontecer a mesma coisa com oFuture
sem delay, ele vai executar o callback e depois agendar amicrotask #2
, e pronto, ela vai ser executada depois que oFuture.delayed
finalizar. - Deixei abaixo a resposta do log e vocês podem ver que tudo que está no
future
é executado primeiro, e asschedulesMicrotask
seram agendadas pelo event loop e executadas depois.
import 'dart:async';
void main() {
const a = 10;
const b = 20;
const c = a * b;
print(c);
scheduleMicrotask(() => print("microtask #1"));
Future.delayed(Duration(seconds: 1), () => {
print("future #1"),
scheduleMicrotask(
() => print("Microtask #2"),
)}).then((_) => print("future #1b"));
Future(() => print("future #2")).then((_) => print("future #2b"))
.then((_) => scheduleMicrotask(() => print("microtask #3")));
print(a / b);
}
200
0.5
microtask #1
future #2
future #2b
microtask #3
future #1
future #1b
Microtask #2
Por fim, é isso mesmo, galera. Finalizei essa parte dois e provavelmente será a última sobre o Event Loop em si, mas ainda temos vários outros assuntos sobre Dart que eu vou trazer nas próximas semanas.
Texto Feito por Enzo Lanzellotti
Revisado pelo Gemini
Top comments (0)