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/1-generators/article.md
+14-14
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Geradores
2
2
3
-
Funções regulares retorna apenas um único valor (ou nenhum).
3
+
Funções regulares retornam apenas um único valor (ou nenhum).
4
4
5
5
Geradores podem retornar ("yield") múltiplos valores, um após o outro, sob demanda. Eles funcionam muito bem com [iteráveis](info:iterable), permitindo criar fluxos de dados com facilidade.
Agora o generator está concluído. Vemos isso em `done:true` e `value:3` como o resultado final.
91
+
Agora o `generator` está concluído. Vemos isso em `done:true` e `value:3` como resultado final.
92
92
93
93
Novas chamadas à `generator.next()` não fazem mais sentido. Se as fizermos, elas retornam o mesmo objeto: `{done: true}`.
94
94
@@ -154,11 +154,11 @@ let sequence = [0, ...generateSequence()];
154
154
alert(sequence); // 0, 1, 2, 3
155
155
```
156
156
157
-
No código acima, `...generateSequence()` transforma o objeto gerador iterável em um array de itens (leia mais sobre a sintaxe de propagação no capítulo [](info:rest-parameters-spread#spread-syntax))
157
+
No código acima, `...generateSequence()` transforma o objeto gerador iterável em um array de itens (leia mais sobre a sintaxe de propagação no capítulo <info:rest-parameters-spread#spread-syntax>)
158
158
159
159
## Utilizando geradores para iteráveis
160
160
161
-
Há algum tempo, no capítulo [](info:iterable), criamos um objeto iterável `range` que retorna valores `from..to`.
161
+
Há algum tempo, no capítulo <info:iterable>, criamos um objeto iterável `range` que retorna valores `from..to`.
Podemos usar uma função geradora para iteração, fornecendo-a como `Symbol.iterator`.
196
196
197
-
Aqui está o mesmo objeto `range`, porém muito mais compacto:
197
+
Aqui está o mesmo objeto `range`, porém muito mais compacto:
198
198
199
199
```js run
200
200
let range = {
@@ -211,7 +211,7 @@ let range = {
211
211
alert( [...range] ); // 1,2,3,4,5
212
212
```
213
213
214
-
Iso funciona porque `range[Symbol.iterator]()` agora retorna um gerador, e os métodos do gerador são exatamente o que `for..of` espera:
214
+
Isso funciona porque `range[Symbol.iterator]()` agora retorna um gerador, e os métodos do gerador são exatamente o que `for..of` espera:
215
215
- ele tem um método `.next()`
216
216
- que retorna valores no formato `{value: ..., done: true/false}`
217
217
@@ -278,7 +278,7 @@ alert(str); // 0..9A..Za..z
278
278
279
279
A diretiva `yield*`*delega* a execução para outro gerador. Isso significa que `yield* gen` itera sobre o gerador `gen` e encaminha transparentemente seus valores para fora. Como se os valores fossem gerados pelo gerador externo.
280
280
281
-
O resultado é o mesmo que se estivéssemos incorporado o código dos geradores aninhados:
281
+
O resultado é o mesmo que se incorporássemos o código dos geradores aninhados:
282
282
283
283
```js run
284
284
function*generateSequence(start, end) {
@@ -341,7 +341,7 @@ generator.next(4); // --> passa o valor para dentro do gerador
341
341

342
342
343
343
1. A primeira chamada `generator.next()` sempre deve ser feito sem um argumento (o argumento é ignorado se passado). Isso inicia a execução e retorna o resultado do primeiro `yield "2+2=?"`. Nesse ponto, o gerador pausa a execução, enquanto espera na linha `(*)`.
344
-
2. Então, como mostrado na imagem acima, o resultado do `yield`é vai para a variável `question` no código que chama.
344
+
2. Então, como mostrado na imagem acima, o resultado do `yield` vai para a variável `question` no código que o chamou.
345
345
3. Em `generator.next(4)`, o gerador é retomado, e `4` entra como o resultado: `let result = 4`.
346
346
347
347
Observe que o código externo não precisa chamar `next(4)` imediatamente. Pode levar algum tempo. Isso não é um problema: o gerador esperará.
@@ -353,7 +353,7 @@ Por exemplo:
353
353
setTimeout(() =>generator.next(4), 1000);
354
354
```
355
355
356
-
Como podemos ver, ao contrário de funções regulares, um gerador e o código que o chama pode trocar resultados passando valores em `next/yield`
356
+
Como podemos ver, ao contrário de funções regulares, um gerador e o código que o chamou pode trocar resultados passando valores em `next/yield`
357
357
358
358
Para tornar as coisas mais claras, aqui está outro exemplo com mais chamadas:
359
359
@@ -385,9 +385,9 @@ A imagem da execução:
385
385
2. O resultado é retornado para o código externo.
386
386
3. O segundo `.next(4)` passa `4` de volta para o gerador como resultado do primeiro `yield` e retoma a execução.
387
387
4. ...Alcança o segundo `yield`, que se torna o resultado da chamada do gerador.
388
-
5. O terceiro `next(9)` passa `9` para o gerador como resultado do segundo `yield` e retoma e execução que alcança o final da função, então `done: true`.
388
+
5. O terceiro `next(9)` passa `9` para o gerador como resultado do segundo `yield` e retoma a execução que alcança o final da função, então `done: true`.
389
389
390
-
É como um jogo de "pingue-pongue". Cada `next(value)` (com exceção do primeiro) passa um valor para o gerador, que se torna o resultado do `yield` atual, e então recebe de volta o valor do próximo `yield`.
390
+
É como um jogo de "pingue-pongue". Cada `next(value)` (com exceção do primeiro) passa um valor para o gerador, que se torna o resultado do `yield` atual, e então recebe de volta o valor do próximo `yield`.
391
391
392
392
## generator.throw
393
393
@@ -419,9 +419,9 @@ generator.throw(new Error("A resposta não foi encontrada no meu banco de dados"
419
419
*/!*
420
420
```
421
421
422
-
O erro, lançado no ,gerador na linha `(2)` leva a uma exceção na linha `(1)` com `yield`. No exemplo acima, `try..catch`o captura e o mostra.
422
+
O erro, lançado no gerador na linha `(2)` leva a uma exceção na linha `(1)` com `yield`. No exemplo acima, `try..catch` captura e o exibe.
423
423
424
-
Se não o capturamos, então assim como qualquer exceção, ela "cai para fora" do gerador para o código que o chama.
424
+
Se não o capturamos, então assim como qualquer exceção, ela "cai para fora" do gerador para o código que o chamou.
425
425
426
426
A linha atual do código que chama é a linha com `generator.throw`, rotulada como `(2)`. Portanto, devemos capturá-lo aqui, assim:
Se usarmos novamente `generator.return()` em um gerador finalizado, ele retornará esse valor novamente ([MDN](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Generator/return)).
467
467
468
-
Frequentemente, não o usamos, pois na maioria das vezes queremos obter todos os valores retornados, mas pode ser útil quando queremos interromper um gerador em uma condição específica.
468
+
Frequentemente, não o usamos, pois, na maioria das vezes queremos obter todos os valores retornados, mas pode ser útil quando queremos interromper um gerador em uma condição específica.
0 commit comments