JavaScript Interview Questions
  • JavaScript Interview Questions
  • Contact
  • Introduction
  • Question 1
  • Question 2
  • Question 3
  • Question 4
  • Question 5
  • Question 6
  • Question 7
  • Question 8
  • Question 9
  • Question 10
  • Question 11
  • Question 12
  • Question 13
  • Question 14
  • Question 15
  • Question 16
  • Question 17
  • Question 18
  • Question 19
  • Question 20
  • Question 21
  • Question 22
  • Question 23
  • Question 24
  • Question 25
  • Question 26
  • Question 27
  • Question 28
  • Question 29
  • Question 30
  • Question 31
  • Question 32
  • Question 33
  • Question 34
  • Question 35
  • Question 36
  • Question 37
  • Question 38
  • Question 39
  • Question 40
  • Question 41
  • Question 42
  • Question 43
  • Question 44
  • Question 45
  • Question 46
  • Question 47
  • Question 48
  • Question 49
  • Question 50
  • Question 51
  • Question 52
  • Question 53
  • Question 54
  • Question 55
  • Question 56
  • Question 57
  • Question 58
  • Question 59
  • Question 60
  • Question 61
  • Question 62
  • Question 63
  • Question 64
  • Question 65
  • Question 66
  • Question 67
  • Question 68
  • Question 69
  • Question 70
  • Question 71
  • Question 72
  • Question 73
  • Question 74
  • Question 75
  • Question 76
  • Question 77
  • Question 78
  • Question 79
  • Question 80
  • Question 81
  • Question 82
  • Question 83
  • Question 84
  • Question 85
  • Question 86
  • Question 87
  • Question 88
  • Question 89
  • Question 90
  • Question 91
  • Question 92
  • Question 93
  • Question 94
  • Question 95
  • Question 96
  • Question 97
  • Question 98
  • Question 99
  • Question 100
  • Epilogue
Powered by GitBook
On this page
  • Question
  • Answer

Question 29

Question

How would you create an infinite async iterator using Symbol.asyncIterator?

Answer

class InfiniteAsyncIterator {
  constructor() {
    this[Symbol.asyncIterator] = this.asyncIterator.bind(this);
  }

  async* asyncIterator() {
    let count = 0;
    while (true) {
      yield `Value ${count++}`;
      await new Promise(resolve => setTimeout(resolve, 100)); // Simulate an async operation
    }
  }
}

const iterator = new InfiniteAsyncIterator();
async function consumeIterator() {
  for await (const value of iterator) {
    console.log(value);
    // Do something with the yielded value...
    if (count > 10) break; // Stop after a certain number of values
  }
}

consumeIterator(); 

Explanation:

  1. Symbol.asyncIterator: This special symbol ensures our class functions as an async iterator. We attach our asyncIterator method to it.

  2. async* asyncIterator():

    • Declares an asynchronous generator function using async*.

    • Uses a while (true) loop to create an infinite stream.

    • yield: Yields the current value (Value ${count}) and pauses execution.

    • await new Promise(...): Introduces a delay to simulate an asynchronous operation before yielding the next value.

  3. consumeIterator(): An example function demonstrating how to use the iterator:

    • Uses for await ... of to iterate over the values yielded by the iterator.

    • Logs each value (you'd replace this with your actual processing logic).

    • Sets a limit (count > 10) to break out of the loop after a certain number of iterations.

Key Points:

  • Infinite Loop: The while (true) loop ensures that the iterator generates values indefinitely.

  • Async Operations: Using await allows you to simulate real-world asynchronous tasks within the iterator.

  • for await ... of: The specific syntax for iterating over async iterators in JavaScript.

Remember: Infinite loops can consume resources, so use them cautiously and implement appropriate stopping mechanisms if needed (like in our example).

PreviousQuestion 28NextQuestion 30

Last updated 9 months ago