Resumo : neste tutorial, você aprenderá sobre os geradores assíncronos de JavaScript que iteram sobre dados que chegam de forma assíncrona.
O que é um gerador assíncrono
Um gerador assíncrono é semelhante a um gerador normal , exceto que seu next()
método retorna Promise . Para iterar em um gerador assíncrono, você usa a for await...of
instrução.
Introdução aos geradores assíncronos JavaScript
Um gerador regular é uma função que pode fazer uma pausa no meio do caminho e continuar de onde parou. Veja o exemplo a seguir:
function* sequence(start, end) {
for (let i = start; i <= end; i++) {
yield i;
}
}
let seq = sequence(1, 5);
for (const num of seq) {
console.log(num);
}
Linguagem de código: JavaScript ( javascript )
O sequence
é um gerador que retorna um número de start
para end
.
Um gerador assíncrono é semelhante a um gerador normal, com as seguintes diferenças:
- A
async
palavra-chave é colocada antes dafunction
palavra-chave. - O
yield
retorna aPromise
, em vez de um valor. Normalmente éPromise
um wrapper de uma operação assíncrona.
O seguinte ilustra como converter o gerador sequence
em gerador assíncrono asyncSequence
:
async function* asyncSequence(start, end) {
for (let i = start; i <= end; i++) {
yield new Promise((resolve, reject) => {
setTimeout(() => {
resolve(i);
}, 1000);
});
}
}
Linguagem de código: JavaScript ( javascript )
Observe que usamos o setTimeout()
para simular uma operação assíncrona.
Para iterar em todo o gerador assíncrono, você usa a for await...of
instrução.
Como só podemos usar a await
palavra-chave dentro de uma async
função, envolvemos o código dentro de um IIFE assíncrono da seguinte forma:
(async () => {
let seq = asyncSequence(1, 5);
for await (let num of seq) {
console.log(num);
}
})();
Linguagem de código: JavaScript ( javascript )
O código retorna uma sequência de 1 a 5 após cada segundo:
1
2
3
4
5
Linguagem de código: JavaScript ( javascript )
Os geradores assíncronos podem ser muito úteis quando você acessa um fluxo de dados e deseja relatar o progresso como se estivesse usando uma barra de progresso.