JavaScript виконання коду JavaScript підключення зовнішнього файлу JavaScript console.log JavaScript змінні і константи JavaScript типи даних JavaScript операції зі змінними JavaScript перетворення даних JavaScript масиви JavaScript умовні конструкції JavaScript цикли JavaScript функції JavaScript область видимості змінних JavaScript замикання і функції IIFE JavaScript Паттерн Модуль JavaScript рекурсивні функції JavaScript перевизначення функцій JavaScript hoisting JavaScript передача параметрів за значенням і за посиланням JavaScript стрілочні функції JavaScript ООП Object JavaScript ООП вкладені об'єкти і масиви в об'єктах JavaScript ООП перевірка наявності і перебір методів і властивостей JavaScript ООП об'єкти у функціях JavaScript ООП конструктори об'єктів JavaScript ООП розширення об'єктів. prototype JavaScript ООП інкапсуляція JavaScript ООП Функція як об'єкт. Методи call і apply JavaScript ООП спадкування JavaScript ООП Ключове слово this JavaScript ООП Object destructuring JavaScript ООП класи JavaScript ООП Date. Робота з датами JavaScript Об'єкт Math. математичні операції JavaScript Об'єкт Array. Робота з масивами JavaScript ООП об'єкт Number JavaScript String JavaScript String Об'єкт RegExp. Регулярні вирази JavaScript String Регулярні вирази в методах String JavaScript String Синтаксис регулярних виразів JavaScript Робота з браузером і BOM JavaScript діалогові вікна JavaScript Історія браузера. об'єкт history JavaScript об'єкт location JavaScript об'єкт navigator JavaScript таймери JavaScript DOM Введення JavaScript DOM Об'єкт document. Пошук елементів JavaScript DOM Властивості об'єкта document JavaScript DOM Об'єкт Node. Навігація по DOM JavaScript DOM Створення, додавання і видалення елементів веб-сторінки JavaScript DOM Об'єкт Element. управління елементами JavaScript DOM Зміна стилю елементів JavaScript події. Введення в обробку подій. JavaScript події обробники JavaScript події. об'єкт Event JavaScript події. поширення подій JavaScript події миші JavaScript події клавіатури JavaScript FORMS. Форми і їх елементи JavaScript FORMS. Кнопки JavaScript FORMS. текстові поля JavaScript FORMS. Прапорці та перемикачі JavaScript FORMS. Список select JavaScript JSON JavaScript зберігання даних. cookie JavaScript зберігання даних. Web Storage JavaScript Collection. Ітератори JavaScript Collection. Генератори JavaScript Collection. Множина Set JavaScript Collection. Map JavaScript Collection. WeakSet і WeakMap JavaScript AJAX. XMLHttpRequest JavaScript AJAX. Відправка даних JavaScript AJAX. Promise в Ajax-запитах

JavaScript Collection. Генератори


Генератори представляють особливий тип функції, які використовуються для генерації значень. Для визначення генераторів застосовується символ зірочки * , який ставиться після ключового слова function . Наприклад, визначимо найпростіший генератор:

function* getNumber(){
    yield 5;
}

let numberGenerator = getNumber();

let next = numberGenerator.next();
console.log(next);

Функція getNumber представляє генератор. Функція генератора повертає ітератор. Для отримання значення з генератора застосовується оператор yield . Тобто фактично в даному випадку генератор генерує число 5 .

Далі за допомогою виклику цієї функції створюється об'єкт ітератора у вигляді змінної numberGenerator . Використовуючи цей об'єкт, ми можемо отримувати з генератора значення.

Для переходу до наступного значення застосовується метод next () . Якщо ми подивимося на консольний результат, то ми побачимо, що даний метод повертає наступні дані:

function* getNumber(){
    yield 5;
}

let numberGenerator = getNumber();

let next = numberGenerator.next();
console.log(next);

next = numberGenerator.next();
console.log(next);

Тут звернення до методу next() відбувається два рази:

getNumber [/tag_code]генерує тільки одне значення - число  5 . Тому при повторному виклику властивість  value матиме значення  undefined , а властивість  done -  true , тобто робота генератора завершена.[/p]

Генератор може створювати безліч значень:

[code]function* getNumber(){ yield 5; yield 25; yield 125; } let numberGenerator = getNumber(); console.log(numberGenerator.next()); console.log(numberGenerator.next()); console.log(numberGenerator.next()); console.log(numberGenerator.next());

Консольний результат:

next()[/tag_code] з ітератора витягується значення, яке йде після першого оператора  yield , при другому виклику методу  next ()  - значення після другого оператора  yield і так далі.[/p]

Оскільки для отримання значень застосовується ітератор, то ми можемо використовувати цикл for ... of :

[code]function* getNumber(){ yield 5; yield 25; yield 125; } let numberGenerator = getNumber(); for(let num of numberGenerator){ console.log(num); }

Консольний результат:

yield[/tag_code]. Він також може містити більш складну логіку.[/p]

За допомогою генераторів зручно створювати нескінченні послідовності:

[code]function* points(){ let x = 0; let y = 0; while(true){ yield {x:x, y:y}; x += 2; y += 1; } } let pointGenerator = points(); console.log(pointGenerator.next().value); console.log(pointGenerator.next().value); console.log(pointGenerator.next().value);

Консольний результат:

next() [/tag_code]можна передати в генератор дані.[/p]

[code]function* getNumber(){

    let n = yield 5;
    console.log("n:", n);

    let m = yield 25 * n;
    console.log("m:", m);

    yield 125 * m;

}

let numberGenerator = getNumber();
 
console.log(numberGenerator.next().value);
console.log(numberGenerator.next(2).value);
console.log(numberGenerator.next(3).value);

Консольний висновок:

next()[/tag_code]:[/p]

[code]numberGenerator.next(2).value

Ми можемо отримати передані через нього дані, присвоївши результат першого оператора yield :

let n = yield 5;

Тобто тут змінна n дорівнюватиме 2 , так як в метод next() передається число 2 .

Далі ми можемо використовувати це значення, наприклад, для генерації нового значення:

let m = yield 25 * n;

Відповідно, змінна m отримає значення, передане через третій виклик методу next() , тобто число 3 .


ініціалізація генератора

Є також інший спосіб передачі даних в генератор, коли ми передаємо деякі дані в саму функцію генератора, тобто фактично ініціалізуємо генератор деякими початковими даними:

function* takeItem(arr){
    for(var i=0; i < arr.length; i++){
        yield arr[i];
    }
}

var users = ["Tom", "Bob", "Sam", "Alice", "Kate", "Ann"];
 
var userGenerator = takeItem(users);
 
var timer = setInterval(function(){

    var user = userGenerator.next();
    if(user.done){
        clearInterval(timer);
        console.log("The End...");
    } else{
        console.log(user.value);
    }

}, 500);

В даному випадку в генератор передається масив, який використовується для генерації значень в таймері.


Наш партнер:
beta test mp3 playlist downloader