ES6 представляет новую концепцию, называемую генератором (или функцией генератора). Это дает вам новый способ работы с итераторами и функциями. Генератор ES6 — это новый тип функции, которую можно приостановить в середине или много раз в середине и возобновить позже. В стандартной функции управление остается за вызываемой функцией до тех пор, пока она не вернется, но функция генератора в ES6 позволяет вызывающей функции управлять выполнением вызываемой функции.
Разница между генератором и обычной функцией заключается в следующем:
- В ответ на вызов генератора его код не запускается. Вместо этого он возвращает специальный объект, называемый «Объектом-генератором», для управления выполнением.
- В любое время функция генератора может вернуть (или передать) управление обратно вызывающему абоненту.
- Генератор может возвращать (или выдавать) несколько значений в соответствии с требованиями, в отличие от обычной функции.
Синтаксис: Функции генератора имеют синтаксис, аналогичный синтаксису обычных функций. Единственное отличие заключается в том, что функция генератора обозначается звездочкой (*) после ключевого слова function.
function *myfunction() { }
Оператор выхода: В инструкции yield выполнение функции приостанавливается, и вызывающему объекту возвращается значение. В этом случае сохраняется достаточное состояние, чтобы функция могла возобновить работу с того места, на котором она остановилась. После последнего запуска yield функция возобновляет выполнение сразу после того, как она была возобновлена. Вы можете создать серию значений, используя эту функцию.
Следующий метод JavaScript: Метод next() возобновит выполнение функции генератора, когда получит аргумент, заменив полученное выражение, в котором выполнение было приостановлено, аргументом из метода next (). Объекты, возвращаемые методом next (), всегда имеют два свойства.
- value — Данное значение является значением.
- done — Завершенное состояние функции может быть выражено как логическое значение true. В противном случае он дает ложные результаты.
Пример: В этом примере мы берем функцию генератора и генерируем 3 числа и вызываем функцию генератора 4 раза подряд, чтобы увидеть фактический результат, и в заключение мы видим, что, когда мы вызываем функцию генератора в четвертый раз, она выдает значение как неопределенное и свойство done как true. Поскольку при этом вызове функция генератора уже завершает генерацию трех последовательных чисел, поэтому, когда мы вызываем функцию в четвертый раз, она не дает значения и обновляет статус сделано до true, это означает, что в четвертый раз значение генерироваться не будет.
<script>
function* generator() {
yield 1;
yield 2;
yield 3;
}
let obj = generator();
console.log(obj.next());
console.log(obj.next());
console.log(obj.next());
console.log(obj.next());
</script>
Выход:
{
done: false,
value: 1
}
{
done: false,
value: 2
}
{
done: false,
value: 3
}
{
done: true,
value: undefined
}
Оператор Return в функции генератора: Оператор return отправляет указанное значение обратно вызывающему объекту. Он завершает выполнение вызова функции и возвращает результат вызывающему объекту. Операторы, определенные после оператора return, не выполняются в функции. Поэтому оператор return должен находиться в конце функции.
Пример 2: Здесь мы использовали оператор return в 3-й строке, чтобы увидеть, как return работает в функции генератора. Обычно, когда мы пишем какой-либо оператор после оператора return, он выдает ошибку, но здесь при написании любого оператора yield после оператора return он не выдает никакой ошибки, кроме того, что показывает, что вызов функции генератора завершен, это означает, что дальнейших шагов для генерации числа нет.
<script>
function* generator() {
yield 1;
yield 2;
return 3;
yield 4;
}
let obj = generator();
console.log(obj.next());
console.log(obj.next());
console.log(obj.next());
console.log(obj.next());
</script>
Выход:
{
done: false,
value: 1
}
{
done: false,
value: 2
}
{
done: true,
value: 3
}
{
done: true,
value: undefined
}
Вызов функции-генератора внутри другой для создания функции: мы можем вызвать функцию генератора внутри другой функции генератора, используя уступать * оператор (или оператор).
Пример 3: В этом примере мы вызываем функцию генератора внутри другой функции генератора, используя оператор yield*. Существует две функции генератора, одна из которых называется генератор и еще один назван как моя функция обе функции являются функциями параметров. Здесь мы создаем объект функции генератора, вызывая и передавая параметр этой функции и внутри функцию генератора мы будем называть моя функция которая является функцией генератора с помощью оператора yield *.
<script>
function* myfunction(k) {
yield k + 1;
yield k + 2;
yield k + 3;
}
function* generator(i) {
yield i;
yield* myfunction(i);
yield i + 5;
}
let obj = generator(6);
console.log(obj.next());
console.log(obj.next());
console.log(obj.next());
console.log(obj.next());
console.log(obj.next());
console.log(obj.next());
</script>
Выход:
{
done: false,
value: 6
}
{
done: false,
value: 7
}
{
done: false,
value: 8
}
{
done: false,
value: 9
}
{
done: false,
value: 11
}
{
done: true,
value: undefined
}