In our last article, we discussed Iterables
and Iterators
. If you are still new to these, I suggest reading this first.
This article will discuss Generators
and how they are a better alternative to Iterables
.
Generators
Generators
are the special kind of functions that are capable of pausing and resuming the state. They allow us to define an algorithm by writing a function whose execution is not continuous.
Normal functions in Javascript run until they return something or catch any error. If we recall the same function, It will begin from the top again. Unlike normal functions, Generators
can
- Communicate with the caller over the bi-directional channel
- retain their execution context
function* generate(){
//Generator
}
function*
is the syntax used to create Generator functions. Its definition will include at least one yield
operator which allows pausing the execution of the function until the next value is requested.
Example:
function* generate(){
console.log('This will be executed first.');
yield 'Hello';
console.log('This will be executed second.');
yield 'World';
}
Once called, Generators
returns the Generator object which is an Iterator
that can be iterated using the next()
method.
Example:
const generateObject = generate();
console.log(generateObject.next().value);
--> This will be executed first.
--> Hello
console.log(generateObject.next().value);
--> This will be executed second.
--> World
console.log(generateObject.next().value);
--> undefined
This Generator object needs to be assigned to a variable otherwise it will always yield only till the first yield expression on every next()
. In order to run again, we need to make different generator object.
Advantages
- Lazy Evaluation - It calculates value on demand.
- Memory Efficient - Because of on-demand calculation, Generators are memory efficient as it doesn't allocate memory unnecessarily. Unlike normal functions, we don't need to pre-generate all values and keep them in memory in case require in the future.
Summary
Generators
are the functions that return Iterators
which can be iterated. The generator object is one-time use only, in order to reuse we need to create a new generator object.
Still, a lot of things are pending to discuss that cannot be covered in this article like Yield
, return
, and throw
operator. We will be discussing this further in the coming articles.
I hope this article will help you to understand the basics of Generators
. If you have any suggestions, just let me know in the comments section.