Hey, JavaScript enthusiasts! π Are you ready to supercharge your coding skills? Today, weβre diving into Generators β a special kind of function in JavaScript. Donβt worry, itβs not rocket science π (but itβs close)! Letβs cut the jargon and get straight to the action.
What Are Generators? π€
In simple terms, Generators are functions that can pause and resume their execution. Unlike regular functions that run from start to finish, generators give you more control.
How? By using the magic of the function*
syntax and the yield
keyword. Letβs see them in action!
Writing Your First Generator Function π οΈ
function* myFirstGenerator() {
yield "Hello π";
yield "Generators are awesome!";
yield "Goodbye π";
}
// Let's use it!
const gen = myFirstGenerator();
console.log(gen.next()); // { value: 'Hello π', done: false }
console.log(gen.next()); // { value: 'Generators are awesome!', done: false }
console.log(gen.next()); // { value: 'Goodbye π', done: false }
console.log(gen.next()); // { value: undefined, done: true }
Whatβs Happening Here?
-
The
yield
keyword acts as a pause point in your function. - Each call to
gen.next()
moves the function to the nextyield
. - When there are no more
yield
statements, the generator returns{ done: true }
.
Practical Use Cases π―
1. Infinite Series Generators βΎοΈ
Ever wanted to generate infinite numbers without blowing up your memory? Generators to the rescue!
function* infiniteNumbers() {
let num = 1;
while (true) {
yield num++;
}
}
const numbers = infiniteNumbers();
console.log(numbers.next().value); // 1
console.log(numbers.next().value); // 2
console.log(numbers.next().value); // 3
// ... and so on
2. Controlled Iteration for Data Fetching π‘
Need to fetch data in chunks or lazy load something? Generators can help:
function* fetchInChunks(data) {
for (let i = 0; i < data.length; i += 2) {
yield data.slice(i, i + 2);
}
}
const chunks = fetchInChunks([1, 2, 3, 4, 5, 6, 7, 8]);
console.log(chunks.next().value); // [1, 2]
console.log(chunks.next().value); // [3, 4]
console.log(chunks.next().value); // [5, 6]
Fun with Delegating Generators π€ΉββοΈ
Generators can call other generators using yield*
. Letβs make them work together:
function* innerGenerator() {
yield "Iβm the inner generator π―";
}
function* outerGenerator() {
yield "Iβm the outer generator π";
yield* innerGenerator();
yield "Back to the outer generator π";
}
const gen = outerGenerator();
for (const value of gen) {
console.log(value);
}
Output:
Iβm the outer generator π
Iβm the inner generator π―
Back to the outer generator π
Why Use Generators? π€·ββοΈ
- Lazy Evaluation: Generate values only when needed.
- Better Performance: No need to calculate all results upfront.
-
Asynchronous Flow: Combine with
async/await
for cleaner async code.
Trick Question for You! π€π‘
Can a generator function be asynchronous? If yes, how would you use it?
Drop your answers in the comments or try it out in your code! π§βπ»
Wrap-Up π
Generators might seem a bit tricky at first, but with some practice, they can become a powerful tool in your JavaScript arsenal. Start small, explore their possibilities, and soon you'll be wielding them like a pro! πͺ
Do you have a cool use case for generators? Share it with us in the comments below! Letβs learn together. π
Happy coding! π»β¨
Top comments (8)
Damn, these are so powerful, I can think of
n
number of ways to use this like aprogress bar
andinfinite scroll block
with dynamic data fetching. thanks @jagroop2001You're welcome! @thesohailjafri
learning new things every day from you, keep it up bro <3
This is an excellent and engaging introduction to JavaScript Generators! π Generators are powerful for tasks like lazy evaluation and asynchronous flow, and with EchoAPI, you can efficiently test and mock APIs that use generator functions, simplifying your development and debugging process.
Fantastic! Didnβt know this functionality existed in JavaScript π
Level up content!
What's a real world use case for Generators
redux-saga is great generator based library extending by redux with async state handling for complex busines logic.
I write a POC program - long time ago, when generator released in JS :
poker game poc, with generators and regexp
The main game loop was solved with generator.