Blog>
Snippets

Manual Cloning of a Generator Function

Shows how to manually clone a generator function in Redux-Saga for handling concurrent data-fetching operations, ensuring each clone operates on its unique execution context.
function* originalGenerator() {
  yield 'start';
  // Simulate fetching data
  yield 'fetching data...';
  // Data fetched
  yield 'end';
}
Defines an original generator function that simulates a process, e.g., fetching data.
function manualCloneGenerator(originalGen) {
  const history = [];
  return function* () {
    let result = originalGen.next();
    while (!result.done) {
      yield result.value;
      history.push(result.value);
      result = originalGen.next();
    }
    // Replay the history for the clone
    for (const value of history) {
      yield value;
    }
  };
}
Creates a manual cloner for a generator. It captures the yielded values of the original generator and replays them for the clone.
const originalGenInstance = originalGenerator();
const cloneGen = manualCloneGenerator(originalGenInstance);
const cloneGenInstance = cloneGen();

// Demonstration of using the original and cloned generator
console.log(originalGenInstance.next().value); // 'start'
console.log(cloneGenInstance.next().value); // 'start' - from clone
Creates an instance of the original and cloned generator, then demonstrates fetching their first yielded values.