update html css
This commit is contained in:
@@ -8,7 +8,7 @@ sidebar_position: 1
|
||||
|
||||
Генераторы могут порождать (yield) множество значений одно за другим, по мере необходимости. Генераторы отлично работают с перебираемыми объектами и позволяют легко создавать потоки данных.
|
||||
|
||||
- Генераторы создаются при помощи функций-генераторов function* f(…) \{…}.
|
||||
- Генераторы создаются при помощи функций-генераторов `function* f(…) {…}`.
|
||||
- Внутри генераторов и только внутри них существует оператор yield.
|
||||
- Внешний код и генератор обмениваются промежуточными результатами посредством вызовов next/yield.
|
||||
|
||||
@@ -18,11 +18,11 @@ sidebar_position: 1
|
||||
Источник: [https://learn.javascript.ru/generators](https://learn.javascript.ru/generators)
|
||||
Для объявления генератора используется специальная синтаксическая конструкция: function*, которая называется «функция-генератор».
|
||||
|
||||
Основным методом генератора является next(). При вызове он запускает выполнение кода до ближайшей инструкции yield <значение> (значение может отсутствовать, в этом случае оно предполагается равным undefined). По достижении yield выполнение функции приостанавливается, а соответствующее значение – возвращается во внешний код:
|
||||
Основным методом генератора является next(). При вызове он запускает выполнение кода до ближайшей инструкции `yield <значение>` (значение может отсутствовать, в этом случае оно предполагается равным undefined). По достижении yield выполнение функции приостанавливается, а соответствующее значение – возвращается во внешний код:
|
||||
|
||||
Результатом метода next() всегда является объект с двумя свойствами:
|
||||
- value: значение из yield.
|
||||
- done: true, если выполнение функции завершено, иначе false.
|
||||
- **value**: значение из `yield`.
|
||||
- **done**: `true`, если выполнение функции завершено, иначе `false`.
|
||||
```js
|
||||
function* generateSequence() {
|
||||
yield 1;
|
||||
@@ -42,8 +42,8 @@ alert(JSON.stringify(one)); // {value: 1, done: false}
|
||||
## Перебор генераторов
|
||||
Как вы, наверное, уже догадались по наличию метода next(), генераторы являются перебираемыми объектами.
|
||||
|
||||
Возвращаемые ими значения можно перебирать через for..of
|
||||
Это из-за того, что перебор через for..of игнорирует последнее значение, при котором done: true. Поэтому, если мы хотим, чтобы были все значения при переборе через for..of, то надо возвращать их через yield:
|
||||
Возвращаемые ими значения можно перебирать через `for..of`
|
||||
Это из-за того, что перебор через `for..of` игнорирует последнее значение, при котором `done: true`. Поэтому, если мы хотим, чтобы были все значения при переборе через `for..of`, то надо возвращать их через `yield`:
|
||||
```js
|
||||
function* generateSequence() {
|
||||
yield 1;
|
||||
|
||||
@@ -8,23 +8,27 @@ sidebar_position: 2
|
||||
|
||||
Обычные итераторы и генераторы прекрасно работают с данными, которые не требуют времени для их создания или получения.
|
||||
|
||||
Когда мы ожидаем, что данные будут поступать асинхронно, с задержками, можно использовать их асинхронные аналоги и for
|
||||
await..of вместоfor..of.
|
||||
Когда мы ожидаем, что данные будут поступать асинхронно, с задержками, можно использовать их асинхронные аналоги и
|
||||
`for await..of` вместо `for..of`.
|
||||
|
||||
Синтаксические различия между асинхронными и обычными итераторами:
|
||||
|
||||
| | Перебираемый объект | Асинхронно перебираемый |
|
||||
|-------------------------------|-----------------------------|-----------------------------------------------------------|
|
||||
| Метод для получения итератора | Symbol.iterator | Symbol.asyncIterator |
|
||||
| next() возвращает | {value:…, done: true/false} | промис, который завершается с {value:…, done: true/false} |
|
||||
| | Перебираемый объект | Асинхронно перебираемый |
|
||||
|-------------------------------|-------------------------------|-------------------------------------------------------------|
|
||||
| Метод для получения итератора | Symbol.iterator | Symbol.asyncIterator |
|
||||
| next() возвращает | `{value:…, done: true/false}` | промис, который завершается с `{value:…, done: true/false}` |
|
||||
|
||||
Синтаксические различия между асинхронными и обычными генераторами:
|
||||
|
||||
| | Генераторы | Асинхронные генераторы |
|
||||
|-----------------------------|-----------------------------|-----------------------------------------------------------|
|
||||
| Объявление | function* | async function* |
|
||||
| generator.next() возвращает | {value:…, done: true/false} | промис, который завершается с {value:…, done: true/false} |
|
||||
| | Генераторы | Асинхронные генераторы |
|
||||
|-----------------------------|-------------------------------|-------------------------------------------------------------|
|
||||
| Объявление | function* | async function* |
|
||||
| generator.next() возвращает | `{value:…, done: true/false}` | промис, который завершается с `{value:…, done: true/false}` |
|
||||
|
||||
В веб-разработке мы часто встречаемся с потоками данных, когда они поступают по частям. Например, загрузка или выгрузка большого файла.
|
||||
В веб-разработке мы часто встречаемся с потоками данных, когда они поступают по частям. Например, загрузка или выгрузка
|
||||
большого файла.
|
||||
|
||||
Мы можем использовать асинхронные генераторы для обработки таких данных. Также заметим, что в некоторых окружениях, например, браузерах, есть и другое API, называемое Streams (потоки), который предоставляет специальные интерфейсы для работы с такими потоками данных, их преобразования и передачи из одного потока в другой (например, загрузка из одного источника и сразу отправка в другое место).
|
||||
Мы можем использовать асинхронные генераторы для обработки таких данных. Также заметим, что в некоторых окружениях,
|
||||
например, браузерах, есть и другое API, называемое Streams (потоки), который предоставляет специальные интерфейсы для
|
||||
работы с такими потоками данных, их преобразования и передачи из одного потока в другой (например, загрузка из одного
|
||||
источника и сразу отправка в другое место).
|
||||
|
||||
@@ -10,20 +10,20 @@ sidebar_position: 2
|
||||
Вы можете проверить себя, читая их и вспоминая, что они означают:
|
||||
|
||||
- Перед объявлением класса/функции/…:
|
||||
- export [default] class/function/variable ...
|
||||
- export `[default]` class/function/variable ...
|
||||
- Отдельный экспорт:
|
||||
- export {x [as y], ...}.
|
||||
- export `{x [as y], ...}`.
|
||||
- Реэкспорт:
|
||||
- export {x [as y], ...} from "module"
|
||||
- export `{x [as y], ...}` from "module"
|
||||
- export * from "module" (не реэкспортирует export default).
|
||||
- export {default [as y]} from "module" (реэкспортирует только export default).
|
||||
- export `{default [as y]}` from "module" (реэкспортирует только export default).
|
||||
|
||||
Импорт:
|
||||
- Именованные экспорты из модуля:
|
||||
- import {x [as y], ...} from "module"
|
||||
- import `{x [as y], ...}` from "module"
|
||||
- Импорт по умолчанию:
|
||||
- import x from "module"
|
||||
- import {default as x} from "module"
|
||||
- import `{default as x}` from "module"
|
||||
- Всё сразу:
|
||||
- import * as obj from "module"
|
||||
- Только подключить модуль (его код запустится), но не присваивать его переменной:
|
||||
@@ -31,4 +31,4 @@ sidebar_position: 2
|
||||
|
||||
Мы можем поставить import/export в начало или в конец скрипта, это не имеет значения.
|
||||
|
||||
💥 **Обратите внимание, что инструкции import/export не работают внутри \{...}.**
|
||||
💥 **Обратите внимание, что инструкции import/export не работают внутри `{...}`.**
|
||||
|
||||
Reference in New Issue
Block a user