Sobes.tech
Middle+

Millisele andmesstruktuurile on JavaScriptis sarnane Observable objekt?

sobes.tech AI

Vastus AI-lt

Andmestruktūra külm Observable (ingliski. Cold Observable), mis on kontseptsioon reaktiivsetes programmeerimises (näiteks RxJS teegis).

Peamised sarnasused:

  • Hiline loomus: Observable hakkab väärtusi emitima alles siis, kui on tellija (subscriber). Kuni tellimus puudub, Observable ei ole aktiivne.
  • Mitmed tellijad, sõltumatud vood: Iga uus tellija saab kogu väärtuste komplekti algusest peale, sõltumata teistest tellijatest. See loob sõltumatud andmevood iga tellija jaoks.

Näide külmast observable struktuurist (kontseptuaalselt):

// Kujutage ette, et see on mingi "generaat" väärtustele
function generateValues() {
  let i = 0;
  return {
    // Meetod, mis tagastab järgmise väärtuse (kui seda küsitakse)
    next: function() {
      return { value: i++, done: false };
    }
  };
}

// "Observable" - sisuliselt, lihtsalt funktsioon, mis võtab vastu tellija
function coldObservableExample(subscriber) {
  const generator = generateValues();

  // Väärtuste emitimise emulatsioon
  setTimeout(() => {
    subscriber.next(generator.next().value);
  }, 100);

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

  setTimeout(() => {
    subscriber.complete(); // Voog lõpeb
  }, 300);

  // Tagastame tellimuse objekti (tellimise lõpetamiseks)
  return {
    unsubscribe: () => {
      console.log('Telli lõpetamine');
      // Siin võiks olla loogika generaatori/taimerite sulgemiseks
    }
  };
}

// Tellija 1
const subscription1 = coldObservableExample({
  next: (value) => console.log('Tellija 1 sai:', value),
  error: (err) => console.error('Viga 1:', err),
  complete: () => console.log('Tellija 1 lõpetatud')
});

// Tellija 2 (hakkab saama väärtusi algusest peale)
setTimeout(() => {
  const subscription2 = coldObservableExample({
    next: (value) => console.log('Tellija 2 sai:', value),
    error: (err) => console.error('Viga 2:', err),
    complete: () => console.log('Tellija 2 lõpetatud')
  });
}, 150);

// Esimese tellija lõpetamine
setTimeout(() => {
  subscription1.unsubscribe();
}, 250);

Erinevalt soojast Observable (Hot Observable), mis hakkab väärtusi emitima kohe, sõltumata tellijatest, ja kõik tellijad saavad väärtusi alates tellimisest, säilitab külm Observable ja taasesitab kogu andmevoo iga uue tellija jaoks. Just see omadus teeb selle sarnaseks Observable kontseptsiooniga JavaScriptis (näiteks RxJS ja sarnastes teekides).

Võrdlus (lihtsustatud):

Omadus Külm Observable Soe Observable
Emitimise algus Tellimisel Kohe
Voog tellijatele Täielik andmevoog igaühele Väljuvad väärtused tellimisest alates
Kasutus HTTP-päringud, failide lugemine, iteratsioon DOM sündmused, veebisoketid, taimerid