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 28

Question

What is the difference between async iterators, generators, promises, and observables?

Answer

1. Generators:

  • Purpose: Functions that produce sequences of values lazily. They pause execution, yield a value, and resume from where they left off when the next value is requested.

  • Mechanism: Use function* to define them. Inside, use yield to return a value and pause execution. next() is called to retrieve the next yielded value.

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

const gen = numberGenerator();
console.log(gen.next()); // Output: {value: 1, done: false}
console.log(gen.next()); // Output: {value: 2, done: false}
  • Use Cases: Generating sequences of data, simplifying iterative processes, creating custom iterables.

2. Async Iterators:

  • Purpose: Similar to generators but handle asynchronous operations. They pause execution until a promise resolves and yield the result.

  • Mechanism: Defined using async function* and use await inside to wait for promises.

  • Use Cases: Processing asynchronous data streams efficiently, working with APIs that return data in chunks.

async function* fetchData() {
  yield await fetch('https://api.example.com/data'); 
  yield await fetch('https://api.example.com/moreData');
}

const iterator = fetchData();
iterator.next().then(data => console.log(data.value)); // Log first fetched data

3. Promises:

  • Purpose: Represent the eventual result of an asynchronous operation (success or failure). They have states: pending, fulfilled (success), rejected (failure).

  • Mechanism: Created with new Promise(). Resolve with .resolve() when successful or reject with .reject() on failure.

const promise = new Promise((resolve, reject) => {
  setTimeout(() => resolve('Success!'), 2000); // Simulate async operation
});

promise.then(result => console.log(result)) // Handle success
.catch(error => console.error(error)); // Handle failure
  • Use Cases: Handling asynchronous tasks, managing error handling, chaining operations.

4. Observables:

  • Purpose: Provide a stream of data over time. Subscribers can react to each emitted value and manage the lifetime of the observable.

  • Mechanism: Based on reactive programming principles. Use libraries like RxJS.

  • Use Cases: Real-time data streams, handling user events, building complex asynchronous workflows.

import { Observable } from 'rxjs';

const source = new Observable(observer => {
  observer.next('Value 1');
  observer.next('Value 2');
  setTimeout(() => observer.complete(), 1000); // Simulate data stream
});

source.subscribe({
  next: value => console.log(value),
  complete: () => console.log('Stream completed')
});

In Essence:

  • Generators & Async Iterators: For working with sequences of values, either synchronous or asynchronous.

  • Promises: Representing the result of a single asynchronous operation.

  • Observables: Managing streams of data over time and reacting to events as they occur.

PreviousQuestion 27NextQuestion 29

Last updated 9 months ago