Генераторы — это специальный тип функций в JavaScript, которые могут приостанавливать свое выполнение и возобновлять его позже, сохраняя при этом состояние. Они обозначаются звездочкой (*) после ключевого слова function. Генераторы связаны с асинхронностью тем, что позволяют писать асинхронный код в синхронном стиле, упрощая обработку последовательных асинхронных операций.
Основные особенности:
Генераторы — это мощная функциональность JavaScript, которая позволяет создавать функции, способные приостанавливать и возобновлять свое выполнение. Это открывает возможности для контроля потока выполнения и упрощения сложных асинхронных операций.
Генераторы создаются с помощью функции-генератора и возвращают итерируемый объект:
function* generatorFunction() {
yield 'Первое значение';
yield 'Второе значение';
return 'Конечное значение';
}
const generator = generatorFunction();Приостанавливает выполнение и возвращает значение:
function* count() {
yield 1;
yield 2;
yield 3;
}Возобновляет выполнение генератора:
const gen = count();
gen.next(); // { value: 1, done: false }
gen.next(); // { value: 2, done: false }
gen.next(); // { value: 3, done: true }Генераторы особенно полезны для работы с асинхронными операциями:
function* asyncSequence() {
const user = yield fetch('/api/user');
const posts = yield fetch(`/api/posts/${user.id}`);
return posts;
}// Позволяет писать асинхронный код как синхронный
function* processData() {
try {
const data = yield fetchData();
const result = yield process(data);
return result;
} catch (error) {
yield handleError(error);
}
}function* processLargeData(data) {
for (let i = 0; i < data.length; i += 100) {
const chunk = data.slice(i, i + 100);
yield processChunk(chunk);
}
}function* fibonacci() {
let a = 0, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}// ❌ yield вне генератора
function regularFunction() {
yield 'value'; // Ошибка!
}
// ✅ yield в генераторе
function* generatorFunction() {
yield 'value'; // Правильно
}// ❌ Игнорируем результат
generator.next();
// ✅ Используем результат
const result = generator.next();
if (!result.done) {
console.log(result.value);
}Генераторы поддерживаются всеми современными браузерами. Для старых браузеров требуется транспиляция (Babel).
Генераторы — мощный инструмент для контроля потока выполнения и работы с асинхронными операциями, позволяющий писать более читаемый и структурированный код.
Что будет выведено в консоль и почему?
function* generator() {
console.log('Начало');
yield 1;
console.log('Середина');
yield 2;
console.log('Конец');
return 3;
}
const gen = generator();
console.log(gen.next());
console.log(gen.next());
console.log(gen.next());Ответ:
Начало
{ value: 1, done: false }
Середина
{ value: 2, done: false }
Конец
{ value: 3, done: true }
Объяснение:
gen.next() начинается выполнение генератора до первого yield, выводится “Начало”, и возвращается { value: 1, done: false }gen.next() выполнение возобновляется с места остановки, выводится “Середина”, и возвращается { value: 2, done: false }gen.next() выполнение возобновляется снова, выводится “Конец”, и возвращается { value: 3, done: true }, где done: true означает, что генератор завершил выполнениеВажно понимать, что выполнение генератора приостанавливается на каждом yield, а не завершается. Это позволяет сохранять состояние между вызовами и продолжать выполнение с того же места, где оно было приостановлено.
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪