Skip to content

Commit 7054359

Browse files
authored
Update article.md
1 parent bbc9c2e commit 7054359

File tree

1 file changed

+17
-17
lines changed
  • 1-js/12-generators-iterators/1-generators

1 file changed

+17
-17
lines changed

1-js/12-generators-iterators/1-generators/article.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ let generator = generateSequence();
3434

3535
Основным методом генератора является `next()`. При вызове он возобновляет выполнение кода до ближайшего ключевого слова `yield`. По достижении `yield` выполнение приостанавливается, а значение – возвращается во внешний код:
3636

37-
Например, здесь мы создаём генератор и получаем первое полученное значение:
37+
Например, здесь мы создаём генератор и получаем первое из возвращаемых им значений:
3838

3939
```js run
4040
function* generateSequence() {
@@ -52,7 +52,7 @@ let one = generator.next();
5252
alert(JSON.stringify(one)); // {value: 1, done: false}
5353
```
5454

55-
Результатом метода `next()` всегда является объект:
55+
Результатом метода `next()` всегда является объект:
5656
- `value`: значение.
5757
- `done`: `false`, если выполнение функции ещё не завершено, в противном случае `true`.
5858

@@ -80,7 +80,7 @@ alert(JSON.stringify(three)); // {value: 3, *!*done: true*/!*}
8080

8181
![](generateSequence-4.png)
8282

83-
Сейчас генератор полностью выполнен. Мы можем увидеть это из свойства `done:true`и обработать `value:3`, как окончательный результат.
83+
Сейчас генератор полностью выполнен. Мы можем убедиться в этом, проверив свойство `done:true`, и обработать `value:3` как окончательный результат.
8484

8585
Новые вызовы `generator.next()` больше не имеют смысла. Впрочем, если они и будут, то не вызовут ошибки, но будут возвращать один и тот же объект: `{done: true}`.
8686

@@ -97,9 +97,9 @@ alert(JSON.stringify(three)); // {value: 3, *!*done: true*/!*}
9797
9898
## Генератор – итератор
9999
100-
Как вы, наверно, уже догадались по наличию метода `next()`, генераторы являются [итерируемыми](info:iterable) объектами.
100+
Как вы, наверное, уже догадались по наличию метода `next()`, генераторы являются [итерируемыми](info:iterable) объектами.
101101
102-
Его можно перебирать и через `for..of`:
102+
Возвращаемые ими значения можно перебирать через `for..of`:
103103
104104
```js run
105105
function* generateSequence() {
@@ -111,11 +111,11 @@ function* generateSequence() {
111111
let generator = generateSequence();
112112
113113
for(let value of generator) {
114-
alert(value); // 1, then 2
114+
alert(value); // 1, затем 2
115115
}
116116
```
117117

118-
Это выглядит гораздо более привлекательно, чем использовать `.next().value`, верно?
118+
Это выглядит гораздо более привлекательно, чем использование `.next().value`, верно?
119119

120120
...Но обратите внимание: пример выше выводит значение `1`, затем `2`. Значение `3` выведено не будет!
121121

@@ -155,7 +155,7 @@ alert(sequence); // 0, 1, 2, 3
155155

156156
## Использование генераторов вместо итерируемых объектов
157157

158-
Некоторе время назад, в главе [](info:iterable), мы создали итерируемый объект `range`, который возвращает значения `from..to`.
158+
Некоторое время назад, в главе [](info:iterable), мы создали итерируемый объект `range`, который возвращает значения `from..to`.
159159

160160
Давайте вспомним код:
161161

@@ -244,16 +244,16 @@ alert( [...range] ); // 1,2,3,4,5
244244

245245
Композиция генераторов - это особенность генераторов, которая позволяет прозрачно "встраивать" генераторы друг в друга.
246246

247-
Например, мы хотели бы создать последовательности:
247+
Например, мы хотели бы создать последовательность:
248248
- цифр `0..9` (коды символов 48..57),
249-
- буквы алфавита `a..z` (коды символов 65..90)
250-
- буквы в верхнем регистре `A..Z` (коды символов 97..122)
249+
- за которыми следуют буквы алфавита `a..z` (коды символов 65..90)
250+
- за которыми следуют буквы в верхнем регистре `A..Z` (коды символов 97..122)
251251

252252
Затем мы планируем создавать пароли, выбирая из них символы (можно добавить и символы пунктуации), но сначала нужно сгенерировать последовательность.
253253

254254
У нас уже есть функция-генератор `function* generateSequence(start, end)`. Давайте используем её, чтобы получить 3 последовательности, одну за другой, вместе они именно то, что нам нужно.
255255

256-
В обычной функции, чтобы объектинить результаты из нескольких других функций, мы вызываем их, сохраняем результаты, а затем объединяем в конце.
256+
В обычной функции, чтобы объединить результаты из нескольких других функций, мы вызываем их, сохраняем результаты, а затем объединяем их в конце.
257257

258258
Для генераторов мы можем сделать лучше, как тут:
259259

@@ -316,7 +316,7 @@ for(let code of generateAlphaNum()) {
316316
str += String.fromCharCode(code);
317317
}
318318

319-
alert(str); // 0..9A..Za..z
319+
alert(str); // 0..9a..zA..Z
320320
```
321321

322322
Композиция – это естественное встраивание одного генератора в поток другого.
@@ -325,13 +325,13 @@ alert(str); // 0..9A..Za..z
325325

326326
## yield – дорога в обе стороны
327327

328-
До этого генераторы наиболее напоминали "итераторы на стероидах". Это как они часто используются.
328+
До этого генераторы наиболее напоминали "итераторы на стероидах". Это то, как они часто используются.
329329

330330
Но на самом деле они намного мощнее и гибче.
331331

332332
Всё дело в том, что `yield` – дорога в обе стороны: он не только возвращает результат наружу, но и может передавать значение извне в генератор.
333333

334-
Чтобы это сделать нам нужно вызвать `generator.next(arg)`, с аргументом. Этот аргумент становится результатом `yield`.
334+
Чтобы это сделать, нам нужно вызвать `generator.next(arg)` с аргументом. Этот аргумент становится результатом `yield`.
335335

336336
Продемонстрируем это на примере:
337337

@@ -365,7 +365,7 @@ generator.next(4); // --> передаём результат в генерат
365365
setTimeout(() => generator.next(4), 1000);
366366
```
367367

368-
Синтаксис может показаться немного странным. Функция и вызывабщий код редко передают значения друг другу. Но это именно то, что происходит.
368+
Синтаксис может показаться немного странным. Функция и вызывающий код редко передают значения друг другу. Но это именно то, что происходит.
369369

370370
Чтобы сделать код более очевидным, вот ещё один пример с большим количеством вызовов:
371371

@@ -403,7 +403,7 @@ alert( generator.next(9).done ); // true
403403

404404
## generator.throw
405405

406-
Как мы видели в примерах выше, внешний код может передать значение в генератор, как результат `yield`.
406+
Как мы видели в примерах выше, внешний код может передать значение `yield`.
407407

408408
...Но можно передать не только результат, но и инициировать (пробросить) ошибку. Это естественно, так как ошибка является своего рода результатом.
409409

0 commit comments

Comments
 (0)