[Предложение: учебник]: `yield*` тоже работает в две стороны
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 50/100
- Loại issue
- Tài liệu
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- javascript
- Lĩnh vực
- documentation
Hướng nghiên cứu
Bắt đầu với chương Generators được liên kết trong issue và xem lại phần giải thích hiện có về yield và yield*. Bổ sung một giải thích rõ ràng về cách yield* chuyển tiếp giá trị trả về của generator lồng nhau, sử dụng các ví dụ đã cung cấp; chương này phải trình bày chính xác hành vi đó và cách sử dụng thực tế của nó.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Описание
После прочтения главы учебника про Генераторы мне стала интересна эта тема я и решил уделить чуть больше внимания, чем на остальные темы. И в конечном итоге я нашел одну особенность, которая не была упомянута в данной главе и которую на мой субъективный взгляд стоит добавить.
В главе было рассказано про то, что оператор 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 }`
}
Готовы ли вы принять участие в реализации данного предложения?
Да, я готов(а) принять участие.
- Ngôn ngữ chính
- HTML
- Star
- 4.1k
- Fork
- 922
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của javascript-tutorial/ru.javascript.info
-
suggestion: tutorial
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
javascript-tutorial/ru.javascript.info#2187 · 1 bình luận ·
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
javascript-tutorial/ru.javascript.info#2163 · 1 bình luận ·
-
[Баг]: Đang mởbug
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 65/100
-
[Предложение: учебник]: Đang mởsuggestion: tutorial
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
-
suggestion: tutorial
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 68/100
Tất cả issue của javascript-tutorial/ru.javascript.info
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
palladius/rails8-app-on-gcp#145 ·
-
NeedsTriage
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
-
error Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 85/100
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 85/100
-
textual definition
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
geneontology/go-ontology#32653 ·