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
+17-17Lines changed: 17 additions & 17 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -34,7 +34,7 @@ let generator = generateSequence();
34
34
35
35
Основным методом генератора является `next()`. При вызове он возобновляет выполнение кода до ближайшего ключевого слова `yield`. По достижении `yield` выполнение приостанавливается, а значение – возвращается во внешний код:
36
36
37
-
Например, здесь мы создаём генератор и получаем первое полученное значение:
37
+
Например, здесь мы создаём генератор и получаем первое из возвращаемых им значений:
Сейчас генератор полностью выполнен. Мы можем увидеть это из свойства `done:true`и обработать `value:3`, как окончательный результат.
83
+
Сейчас генератор полностью выполнен. Мы можем убедиться в этом, проверив свойство `done:true`, и обработать `value:3` как окончательный результат.
84
84
85
85
Новые вызовы `generator.next()` больше не имеют смысла. Впрочем, если они и будут, то не вызовут ошибки, но будут возвращать один и тот же объект: `{done: true}`.
Композиция генераторов - это особенность генераторов, которая позволяет прозрачно "встраивать" генераторы друг в друга.
246
246
247
-
Например, мы хотели бы создать последовательности:
247
+
Например, мы хотели бы создать последовательность:
248
248
- цифр `0..9` (коды символов 48..57),
249
-
- буквы алфавита `a..z` (коды символов 65..90)
250
-
- буквы в верхнем регистре `A..Z` (коды символов 97..122)
249
+
-за которыми следуют буквы алфавита `a..z` (коды символов 65..90)
250
+
-за которыми следуют буквы в верхнем регистре `A..Z` (коды символов 97..122)
251
251
252
252
Затем мы планируем создавать пароли, выбирая из них символы (можно добавить и символы пунктуации), но сначала нужно сгенерировать последовательность.
253
253
254
254
У нас уже есть функция-генератор `function* generateSequence(start, end)`. Давайте используем её, чтобы получить 3 последовательности, одну за другой, вместе они именно то, что нам нужно.
255
255
256
-
В обычной функции, чтобы объектинить результаты из нескольких других функций, мы вызываем их, сохраняем результаты, а затем объединяем в конце.
256
+
В обычной функции, чтобы объединить результаты из нескольких других функций, мы вызываем их, сохраняем результаты, а затем объединяем их в конце.
257
257
258
258
Для генераторов мы можем сделать лучше, как тут:
259
259
@@ -316,7 +316,7 @@ for(let code of generateAlphaNum()) {
316
316
str +=String.fromCharCode(code);
317
317
}
318
318
319
-
alert(str); // 0..9A..Za..z
319
+
alert(str); // 0..9a..zA..Z
320
320
```
321
321
322
322
Композиция – это естественное встраивание одного генератора в поток другого.
@@ -325,13 +325,13 @@ alert(str); // 0..9A..Za..z
325
325
326
326
## yield – дорога в обе стороны
327
327
328
-
До этого генераторы наиболее напоминали "итераторы на стероидах". Это как они часто используются.
328
+
До этого генераторы наиболее напоминали "итераторы на стероидах". Это то, как они часто используются.
329
329
330
330
Но на самом деле они намного мощнее и гибче.
331
331
332
332
Всё дело в том, что `yield` – дорога в обе стороны: он не только возвращает результат наружу, но и может передавать значение извне в генератор.
333
333
334
-
Чтобы это сделать нам нужно вызвать `generator.next(arg)`, с аргументом. Этот аргумент становится результатом `yield`.
334
+
Чтобы это сделать, нам нужно вызвать `generator.next(arg)` с аргументом. Этот аргумент становится результатом `yield`.
335
335
336
336
Продемонстрируем это на примере:
337
337
@@ -365,7 +365,7 @@ generator.next(4); // --> передаём результат в генерат
365
365
setTimeout(() =>generator.next(4), 1000);
366
366
```
367
367
368
-
Синтаксис может показаться немного странным. Функция и вызывабщий код редко передают значения друг другу. Но это именно то, что происходит.
368
+
Синтаксис может показаться немного странным. Функция и вызывающий код редко передают значения друг другу. Но это именно то, что происходит.
369
369
370
370
Чтобы сделать код более очевидным, вот ещё один пример с большим количеством вызовов:
0 commit comments