Skip to content

Latest commit

 

History

History
82 lines (59 loc) · 2.59 KB

module-5.2-generators-and-iterators.md

File metadata and controls

82 lines (59 loc) · 2.59 KB

5.2. Generators and Iterators

Generators and iterators are features introduced in JavaScript to work with sequences of data in a more flexible and efficient manner. They are particularly useful for dealing with large datasets and asynchronous operations.

Generator Functions

Generator functions are defined using an asterisk (*) after the function keyword. They allow you to pause and resume the execution of a function, yielding values one at a time.

Example:

function* generateSequence() {
  yield 1;
  yield 2;
  yield 3;
}

const generator = generateSequence();
console.log(generator.next().value); // Output: 1
console.log(generator.next().value); // Output: 2
console.log(generator.next().value); // Output: 3

In this example, the generateSequence function is a generator that yields values one at a time when the next() method is called on the generator object.

Iterables and Iterators

Iterables are objects that implement an iterable protocol, allowing them to be iterated using a loop or a for...of loop.

Example:

const iterableObject = {
  [Symbol.iterator]: function* () {
    yield 'A';
    yield 'B';
    yield 'C';
  },
};

for (const item of iterableObject) {
  console.log(item);
}

In this example, iterableObject is an iterable object, and it's looped over using a for...of loop.

Asynchronous Generators

Generators can also be used for asynchronous operations. This is particularly useful for handling asynchronous code in a more synchronous-looking manner.

Example:

function* fetchUsers() {
  const response = yield fetch('https://api.example.com/users');
  const data = yield response.json();
  return data;
}

function runAsyncGenerator(generator) {
  const iterator = generator();
  const iterate = (result) => {
    const { value, done } = iterator.next(result);
    if (!done) {
      value.then(iterate);
    }
  };
  iterate();
}

runAsyncGenerator(fetchUsers);

In this example, the fetchUsers generator function fetches user data asynchronously. The runAsyncGenerator function runs the generator and handles the asynchronous operations using the yield keyword.

Benefits

  • Generator functions and iterators provide a more efficient way to work with sequences of data.
  • Asynchronous generators simplify handling asynchronous code, making it appear synchronous.

Understanding and utilizing generators and iterators is valuable for managing complex data sets and asynchronous operations in a more readable and organized manner. These features are powerful tools in modern JavaScript development.