You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/12-generators-iterators/2-async-iterators-generators/article.md
+10-10Lines changed: 10 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -69,7 +69,7 @@ O caso mais comum é quando o objeto precisa fazer uma solicitação de rede par
69
69
70
70
Para tornar um objeto iterável de forma assíncrona:
71
71
72
-
1. Use `Symbol.asyncIterator` em vez de`Symbol.iterator`.
72
+
1. Use o `Symbol.asyncIterator` em vez do`Symbol.iterator`.
73
73
2. O método `next()` deve retornar uma promise (para ser resolvida com o próximo valor).
74
74
- A palavra-chave `async` cuida disso, podemos simplesmente fazer `async next()`.
75
75
3. Para iterar sobre esse objeto, devemos usar um loop `for await (let item of iterable)`.
@@ -124,8 +124,8 @@ Como podemos ver, a estrutura é semelhante aos iteradores tradicionais:
124
124
125
125
1. Para criar um objeto iterável de forma assíncrona, ele deve ter um método `Symbol.asyncIterator``(1)`.
126
126
2. Este método deve retornar o objeto com o método `next()` que retorna uma promise `(2)`
127
-
3. O método `next()` não precisa ser `assíncrono (async)`, pode ser um método regular que retorna uma promise, mas `async` nos permite usar `await`, o que é conveniente. Aqui apenas atrasamos por um segundo `(3)`.
128
-
4. Para iterar, usamos `for await(let value of range)``(4)`, ou seja, adicionamos "await" após "for". Isso chama `range[Symbol.asyncIterator]()` uma vez e, em seguida, seu `next()` para obter valores.
127
+
3. O método `next()` não precisa ser `assíncrono (async)`, pode ser um método comum que retorna uma promise, mas o `async` nos permite usar o`await`, o que é conveniente. Aqui apenas atrasamos por um segundo `(3)`.
128
+
4. Para iterar, usamos `for await(let value of range)``(4)`, ou seja, adicionamos o "await" após o "for". Isso chama `range[Symbol.asyncIterator]()` uma vez e, em seguida, seu `next()` para obter valores.
Isso é natural, pois espera encontrar `Symbol.iterator`, não `Symbol.asyncIterator`.
146
146
147
-
Isso também é válido para `for..of`: a sintaxe sem `await` precisa de`Symbol.iterator`.
147
+
Isso também é válido para `for..of`: a sintaxe sem o `await` precisa do`Symbol.iterator`.
148
148
````
149
149
150
150
## Relembrando os geradores
151
151
152
-
Agora, vamos relembrar os geradores, pois eles permitem encurtar o código de iteração. Na maioria das vezes, quando queremos criar um iterável, usaremos geradores.
152
+
Agora, vamos relembrar dos geradores, pois eles permitem encurtar o código de iteração. Na maioria das vezes, quando queremos criar um iterável, usaremos geradores.
153
153
154
154
Por pura simplicidade, omitindo algumas coisas importantes, eles são "funções que geram (yield) valores". Eles são explicados em detalhes no capítulo [](info:generators).
155
155
@@ -214,7 +214,7 @@ Vamos mudar para geradores assíncronos para tornar isso possível.
214
214
215
215
Para a maioria das aplicações práticas, quando desejamos fazer um objeto que gera de forma assíncrona uma sequência de valores, podemos usar um gerador assíncrono.
216
216
217
-
A sintaxe é simples: prefixe `function*` com `async`. Isso torna o gerador assíncrono.
217
+
A sintaxe é simples: prefixe `function*` com o `async`. Isso torna o gerador assíncrono.
218
218
219
219
E então use `for await (...)` para iterar sobre ele, assim:
220
220
@@ -243,19 +243,19 @@ E então use `for await (...)` para iterar sobre ele, assim:
243
243
})();
244
244
```
245
245
246
-
Como o gerador é assíncrono, podemos usar `await` dentro dele, fazê-lo depender de promises, realizar requisições de rede e assim por diante.
246
+
Como o gerador é assíncrono, podemos usar o `await` dentro dele, fazê-lo depender de promises, realizar requisições de rede e assim por diante.
247
247
248
248
````smart header="Diferença de baixo dos panos"
249
249
Tecnicamente, se você é um leitor avançado que se lembra dos detalhes dos geradores, há uma diferença interna.
250
250
251
251
Para geradores assíncronos, o método `generator.next()` é assíncrono, ele retorna promises.
252
252
253
-
Em um gerador tradicional usaríamos `result = generator.next()` para obter valores. Em um gerador assíncrono, devemos adicionar `await`, assim:
253
+
Em um gerador tradicional, usaríamos `result = generator.next()` para obter valores. Em um gerador assíncrono, devemos adicionar o `await`, assim:
254
254
255
255
```js
256
256
result = await generator.next(); // result = {value: ..., done: true/false}
257
257
```
258
-
É por isso que geradores assíncronos funcionam com `for await...of`.
258
+
É por isso que geradores assíncronos funcionam com `for await...of`.
259
259
````
260
260
261
261
### Async iterable range
@@ -408,6 +408,6 @@ Diferenças de sintaxe entre geradores assíncronos e tradicionais:
408
408
| Declaração |`function*`|`async function*`|
409
409
| valor retornado por `next()` é |`{value:…, done: true/false}`|`Promise` que se resolve para `{value:…, done: true/false}`|
410
410
411
-
Na área de desenvolvimento web, frequentemente nos deparamos com fluxos de dados, nos quais os dados fluem pedaço por pedaço. Por exemplo, ao baixar ou enviar um arquivo grande.
411
+
Na área de desenvolvimento web, frequentemente nos deparamos com fluxos de dados, nos quais os dados fluem pedaço por pedaço. Por exemplo, ao baixarmos ou enviarmos um arquivo grande.
412
412
413
413
Podemos usar geradores assíncronos para processar esses tipos de dados. Também é importante mencionar que em alguns ambientes, como em navegadores, existe outra API chamada Streams, que fornece interfaces especiais para trabalhar com esses fluxos, transformar dados e transmiti-los de um fluxo para outro (por exemplo, baixar de um local e enviar imediatamente para outro).
0 commit comments