From c3c72fc22e4b30427d6d17a15a598dab14346158 Mon Sep 17 00:00:00 2001 From: RedrockJS Date: Wed, 5 Mar 2025 16:38:24 +0300 Subject: [PATCH] update modules --- .../javascript/09-generators/01-generators.md | 62 +++++++++++++++++++ .../02-async-iterators-generators.md | 30 +++++++++ docs/javascript/09-generators/index.md | 0 docs/javascript/10-modules/01-modules.md | 39 ++++++++++++ .../javascript/10-modules/02-import-export.md | 34 ++++++++++ docs/javascript/10-modules/index.md | 0 6 files changed, 165 insertions(+) create mode 100644 docs/javascript/09-generators/01-generators.md create mode 100644 docs/javascript/09-generators/02-async-iterators-generators.md delete mode 100644 docs/javascript/09-generators/index.md create mode 100644 docs/javascript/10-modules/01-modules.md create mode 100644 docs/javascript/10-modules/02-import-export.md delete mode 100644 docs/javascript/10-modules/index.md diff --git a/docs/javascript/09-generators/01-generators.md b/docs/javascript/09-generators/01-generators.md new file mode 100644 index 0000000..9d94ecb --- /dev/null +++ b/docs/javascript/09-generators/01-generators.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 1 +--- + +# Генераторы + +Обычные функции возвращают только одно-единственное значение (или ничего). + +Генераторы могут порождать (yield) множество значений одно за другим, по мере необходимости. Генераторы отлично работают с перебираемыми объектами и позволяют легко создавать потоки данных. + +- Генераторы создаются при помощи функций-генераторов function* f(…) \{…}. +- Внутри генераторов и только внутри них существует оператор yield. +- Внешний код и генератор обмениваются промежуточными результатами посредством вызовов next/yield. + +В современном JavaScript генераторы используются редко. Но иногда они оказываются полезными, потому что способность функции обмениваться данными с вызывающим кодом во время выполнения совершенно уникальна. И, конечно, для создания перебираемых объектов. + +## Функция-генератор +Источник: [https://learn.javascript.ru/generators](https://learn.javascript.ru/generators) +Для объявления генератора используется специальная синтаксическая конструкция: function*, которая называется «функция-генератор». + +Основным методом генератора является next(). При вызове он запускает выполнение кода до ближайшей инструкции yield <значение> (значение может отсутствовать, в этом случае оно предполагается равным undefined). По достижении yield выполнение функции приостанавливается, а соответствующее значение – возвращается во внешний код: + +Результатом метода next() всегда является объект с двумя свойствами: +- value: значение из yield. +- done: true, если выполнение функции завершено, иначе false. +```js +function* generateSequence() { + yield 1; + yield 2; + return 3; +} +let generator = generateSequence(); +let one = generator.next(); +alert(JSON.stringify(one)); // {value: 1, done: false} +``` + +💥 **function\* f(…) или function \*f(…)** + +Нет разницы, оба синтаксиса корректны.\ +Но обычно предпочтителен первый вариант, так как звёздочка относится к типу объявляемой сущности (function* – «функция-генератор»), а не к её названию, так что резонно расположить её у слова function. + +## Перебор генераторов +Как вы, наверное, уже догадались по наличию метода next(), генераторы являются перебираемыми объектами. + +Возвращаемые ими значения можно перебирать через for..of +Это из-за того, что перебор через for..of игнорирует последнее значение, при котором done: true. Поэтому, если мы хотим, чтобы были все значения при переборе через for..of, то надо возвращать их через yield: +```js +function* generateSequence() { + yield 1; + yield 2; + yield 3; +} +let generator = generateSequence(); +for(let value of generator) { + alert(value); // 1, затем 2, затем 3 +} +``` + +## yield – дорога в обе стороны +`yield` – дорога в обе стороны: он не только возвращает результат наружу, но и может передавать значение извне в генератор. + +Чтобы это сделать, нам нужно вызвать `generator.next(arg)` с аргументом. Этот аргумент становится результатом `yield`. diff --git a/docs/javascript/09-generators/02-async-iterators-generators.md b/docs/javascript/09-generators/02-async-iterators-generators.md new file mode 100644 index 0000000..8dc1d52 --- /dev/null +++ b/docs/javascript/09-generators/02-async-iterators-generators.md @@ -0,0 +1,30 @@ +--- +sidebar_position: 2 +--- + +# Асинхронные итераторы и генераторы + +Источник: [https://learn.javascript.ru/async-iterators-generators](https://learn.javascript.ru/async-iterators-generators) + +Обычные итераторы и генераторы прекрасно работают с данными, которые не требуют времени для их создания или получения. + +Когда мы ожидаем, что данные будут поступать асинхронно, с задержками, можно использовать их асинхронные аналоги и for +await..of вместоfor..of. + +Синтаксические различия между асинхронными и обычными итераторами: + +| | Перебираемый объект | Асинхронно перебираемый | +|-------------------------------|-----------------------------|-----------------------------------------------------------| +| Метод для получения итератора | 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} | + +В веб-разработке мы часто встречаемся с потоками данных, когда они поступают по частям. Например, загрузка или выгрузка большого файла. + +Мы можем использовать асинхронные генераторы для обработки таких данных. Также заметим, что в некоторых окружениях, например, браузерах, есть и другое API, называемое Streams (потоки), который предоставляет специальные интерфейсы для работы с такими потоками данных, их преобразования и передачи из одного потока в другой (например, загрузка из одного источника и сразу отправка в другое место). diff --git a/docs/javascript/09-generators/index.md b/docs/javascript/09-generators/index.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/javascript/10-modules/01-modules.md b/docs/javascript/10-modules/01-modules.md new file mode 100644 index 0000000..2d48a92 --- /dev/null +++ b/docs/javascript/10-modules/01-modules.md @@ -0,0 +1,39 @@ +--- +sidebar_position: 1 +--- + +# Модули + +Основные понятия: +1. Модуль – это файл. Чтобы работал `import/export`, нужно для браузеров указывать атрибут `