Sobes.tech
Middle+

Milyen adatstruktúrához hasonlít a JavaScript-ben az Observable objektum?

sobes.tech MI

Válasz az MI-től

Az adatszerkezet hideg Observable (angolul Cold Observable), amely a reaktív programozás egyik fogalma (például az RxJS könyvtárban).

Fő hasonlóságok:

  • Lusta természet: Az Observable csak akkor kezd el értékeket kibocsátani, amikor van feliratkozó (subscriber). Feliratkozás nélkül az Observable nem aktív.
  • Sok feliratkozó, független áramlatok: Minden új feliratkozó teljes értékkészletet kap, a legelejétől, függetlenül a többi feliratkozótól. Ez független adatfolyamokat hoz létre minden feliratkozó számára.

Példa a hideg observable szerkezetére (elméleti):

// Képzeljük el, hogy ez egy "érték-generátor"
function generateValues() {
  let i = 0;
  return {
    // Metódus, ami a következő értéket adja vissza (amikor kérik)
    next: function() {
      return { value: i++, done: false };
    }
  };
}

// "Observable" - lényegében csak egy függvény, ami fogad egy feliratkozót
function coldObservableExample(subscriber) {
  const generator = generateValues();

  // Értékek kibocsátásának szimulálása
  setTimeout(() => {
    subscriber.next(generator.next().value);
  }, 100);

  setTimeout(() => {
    subscriber.next(generator.next().value);
  }, 200);

  setTimeout(() => {
    subscriber.complete(); // Áramlat befejezése
  }, 300);

  // Feliratkozási objektum visszaadása (leiratkozáshoz)
  return {
    unsubscribe: () => {
      console.log('Leiratkozás');
      // Itt lehet logika a generátor/ időzítők leállítására
    }
  };
}

// Első feliratkozó
const subscription1 = coldObservableExample({
  next: (value) => console.log('Feliratkozó 1 kapta:', value),
  error: (err) => console.error('Hiba 1:', err),
  complete: () => console.log('Feliratkozó 1 befejeződött')
});

// Második feliratkozó (az értékeket a legelejétől fogja kapni)
setTimeout(() => {
  const subscription2 = coldObservableExample({
    next: (value) => console.log('Feliratkozó 2 kapta:', value),
    error: (err) => console.error('Hiba 2:', err),
    complete: () => console.log('Feliratkozó 2 befejeződött')
  });
}, 150);

// Első feliratkozó leiratkozása
setTimeout(() => {
  subscription1.unsubscribe();
}, 250);

A különbség a forró Observable-hez (Hot Observable), amely az értékeket azonnal elkezdi kibocsátani, függetlenül a feliratkozóktól, és minden feliratkozó a feliratkozás pillanatától kapja az értékeket, az, hogy a hideg Observable minden új feliratkozónak megőrzi és reprodukálja a teljes adatfolyamot. Ez a tulajdonság közelebb hozza a JavaScript Observable (pl. RxJS) fogalmához.

Egyszerűsített összehasonlítás:

Jellemzők Hideg Observable Forró Observable
Kezdete az értékadásnak Feliratkozáskor Azonnal
Az adatfolyam a feliratkozóknak Teljes adatfolyam mindenhez Értékek a feliratkozás pillanatától
Használat HTTP kérések, fájlolvasás, iteráció DOM események, web-socketek, időzítők