[Предложение: учебник]: `yield*` тоже работает в две стороны
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 50/100
- Issue type
- Documentation
- Clarity
- Mostly clear
- Activity status
- Stale
- Tech stack
- javascript
- Domain
- documentation
Research direction
Start with the Generators chapter linked in the issue and review its existing explanation of yield and yield*. Add a clear explanation of how yield* forwards the nested generator's return value, using the provided examples; the chapter should accurately cover this behavior and its practical use.
Written by the indexing model from the issue text.
Description
Описание
После прочтения главы учебника про Генераторы мне стала интересна эта тема я и решил уделить чуть больше внимания, чем на остальные темы. И в конечном итоге я нашел одну особенность, которая не была упомянута в данной главе и которую на мой субъективный взгляд стоит добавить.
В главе было рассказано про то, что оператор yield работает в две стороны - при вызове метода next у генератора оператор возвращает значение справа, а если в метод next передать значение, то оно будет передано части слева от оператора yield.
Так вот, тоже самое работает и при композиции генераторов с использованием оператора yield*. Когда вложенный генератор завершает свое выполнение, выполнив последний yield, он ждет следующего вызова next и уже после исполнение переходит в генератор на уровень выше. Но я заметил, что если прописать после последнего yield оператор return с каким либо значением, то есть передать его на уровень выше, а во внешнем генераторе прописать что то типа let data = yield* generator_func(), то можно принять возвращенное значение.
Пример:
function* f() {
yield 2;
return 3;
}
function* g() {
yield 1;
let data = yield* f();
// тут выполняются некоторые необходимые преобразования значения data
yield data;
}
let gen = g();
gen.next().value; // 1
gen.next().value; // 2
gen.next().value; // 3
Мотивация
Я считаю, что для глубокого понимания концепции композиции генераторов нужно знать о вышеописанной особенности.
В доказательство могу еще привести такой пример. Я попытался реализовать систему сценариев поведения телеграмм бота через генераторы. Все сообщения от пользователя передавались в уникальный для каждого генератор, а полученные значения из этого генератора передавались как сообщения от бота пользователю. В итоге я пришел к выводу, что нужно как то передавать последнее значение yield в генератор уровнем выше. Так и открыл для себя данную особенность композиции генераторов в JavaScript.
Вот пример кода одного из сценариев:
// Пример сценария-генератора
export default function* () {
let num1 = Number( yield `Введите первое число` );
if (isNaN(num1)) {
return yield "[1] Извините, это не число. Повторите попытку"
}
let num2 = Number( yield `Введите второе число` );
if (isNaN(num2)) {
return yield "[2] Извините, это не число. Повторите попытку"
}
return yield `Сумма ваших чисел: ${ num1 + num2 }`
}
Готовы ли вы принять участие в реализации данного предложения?
Да, я готов(а) принять участие.
- Dominant language
- HTML
- Stars
- 4.1k
- Forks
- 922
- PR merge metrics
- No merged PRs in 30d
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from javascript-tutorial/ru.javascript.info
-
suggestion: tutorial
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
javascript-tutorial/ru.javascript.info#2187 · 1 comment ·
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
javascript-tutorial/ru.javascript.info#2163 · 1 comment ·
-
[Баг]: Openbug
Difficulty 1/5 Under an hour Newbie friendliness 65/100
-
suggestion: tutorial
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
-
suggestion: tutorial
Difficulty 3/5 1-2 days Newbie friendliness 68/100
All issues in javascript-tutorial/ru.javascript.info
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
palladius/rails8-app-on-gcp#145 ·
-
NeedsTriage
Difficulty 1/5 Under an hour Newbie friendliness 90/100
-
error Open
Difficulty 1/5 Under an hour Newbie friendliness 85/100
-
Difficulty 1/5 Under an hour Newbie friendliness 85/100
-
textual definition
Difficulty 1/5 Under an hour Newbie friendliness 90/100
geneontology/go-ontology#32653 ·