Middle+
S jakou datovou strukturou je si podobný objekt Observable v JavaScriptu?
sobes.tech AI
Odpověď od AI
Datová struktura studeného Observable (anglicky Cold Observable), což je koncept z reaktivního programování (například v knihovně RxJS).
Hlavní podobnosti:
- Líná povaha: Observable začíná emitovat hodnoty až při existenci odběratele (subscriber). Bez odběratele není Observable aktivní.
- Mnoho odběratelů, nezávislé proudy: Každý nový odběratel obdrží úplný soubor hodnot od začátku, nezávisle na ostatních odběratelích. To vytváří nezávislé datové proudy pro každého odběratele.
Příklad struktury studeného observable (teoreticky):
// Představte si, že je to nějaký "generátor" hodnot
function generateValues() {
let i = 0;
return {
// Metoda, která vrací následující hodnotu (když je požadována)
next: function() {
return { value: i++, done: false };
}
};
}
// "Observable" - v podstatě jen funkce, která přijímá odběratele
function coldObservableExample(subscriber) {
const generator = generateValues();
// Simulace emitování hodnot
setTimeout(() => {
subscriber.next(generator.next().value);
}, 100);
setTimeout(() => {
subscriber.next(generator.next().value);
}, 200);
setTimeout(() => {
subscriber.complete(); // Ukončení proudu
}, 300);
// Vrací objekt odběru (pro odhlášení)
return {
unsubscribe: () => {
console.log('Odhlášení');
// Tady mohla být logika pro ukončení generátoru/časovačů
}
};
}
// Odběratel 1
const subscription1 = coldObservableExample({
next: (value) => console.log('Odběratel 1 obdržel:', value),
error: (err) => console.error('Chyba 1:', err),
complete: () => console.log('Odběratel 1 dokončen')
});
// Odběratel 2 (bude začínat od začátku)
setTimeout(() => {
const subscription2 = coldObservableExample({
next: (value) => console.log('Odběratel 2 obdržel:', value),
error: (err) => console.error('Chyba 2:', err),
complete: () => console.log('Odběratel 2 dokončen')
});
}, 150);
// Odhlášení prvního odběratele
setTimeout(() => {
subscription1.unsubscribe();
}, 250);
Na rozdíl od horkého Observable (Hot Observable), který začíná emitovat hodnoty okamžitě, bez ohledu na odběratele, a všichni odběratelé dostávají hodnoty od okamžiku přihlášení, studený Observable uchovává a reprodukuje celý datový tok pro každého nového odběratele. Tato vlastnost ho přibližuje ke konceptu Observable v JavaScriptu (v kontextu RxJS a podobných knihoven).
Zjednodušené srovnání:
| Charakteristika | Studený Observable | Horký Observable |
|---|---|---|
| Začátek emitování | Při přihlášení | Ihned |
| Tok pro odběratele | Plný datový tok pro každého | Hodnoty od okamžiku přihlášení |
| Použití | HTTP požadavky, čtení souborů, iterace | DOM události, webové sockety, časovače |