Middle+
Kokia duomenų struktūra JavaScript'e yra artima Observable objektui?
sobes.tech AI
Atsakymas iš AI
Duomenų struktūra šalto Observable (angliškai Cold Observable), kuri yra koncepcija iš reaktyvaus programavimo (pavyzdžiui, RxJS bibliotekos kontekste).
Pagrindiniai panašumai:
- Lėta prigimtis: Observable pradeda skleisti reikšmes tik tada, kai yra prenumeratorius (subscriber). Be prenumeratoriaus, Observable nėra aktyvus.
- Daugybė prenumeratorių, nepriklausomi srautai: Kiekvienas naujas prenumeratorius gauna pilną reikšmių rinkinį nuo pradžios, nepriklausomai nuo kitų prenumeratorių. Tai sukuria nepriklausomus duomenų srautus kiekvienam prenumeratoriuui.
Pavyzdys struktūros šalto observable (teoriškai):
// Įsivaizduokite, kad tai yra tam tikras "generuotojas" reikšmių
function generateValues() {
let i = 0;
return {
// Metodas, kuris grąžina kitą reikšmę (kai jos prašoma)
next: function() {
return { value: i++, done: false };
}
};
}
// "Observable" - iš esmės, tik funkcija, kuri priima prenumeratorį
function coldObservableExample(subscriber) {
const generator = generateValues();
// Reikšmių išsiuntimo imitacija
setTimeout(() => {
subscriber.next(generator.next().value);
}, 100);
setTimeout(() => {
subscriber.next(generator.next().value);
}, 200);
setTimeout(() => {
subscriber.complete(); // Srauto pabaiga
}, 300);
// Grąžiname prenumeratos objektą (atsisakymui)
return {
unsubscribe: () => {
console.log('Atsisakymas');
// Čia galėtų būti logika generatoriaus/ laikmačių sustabdymui
}
};
}
// Pirmas prenumeratorius
const subscription1 = coldObservableExample({
next: (value) => console.log('Prenumeratorius 1 gavo:', value),
error: (err) => console.error('Klaida 1:', err),
complete: () => console.log('Prenumeratorius 1 baigėsi')
});
// Antras prenumeratorius (pradės gauti reikšmes nuo pradžios)
setTimeout(() => {
const subscription2 = coldObservableExample({
next: (value) => console.log('Prenumeratorius 2 gavo:', value),
error: (err) => console.error('Klaida 2:', err),
complete: () => console.log('Prenumeratorius 2 baigėsi')
});
}, 150);
// Pirmojo prenumeratoriaus atšaukimas
setTimeout(() => {
subscription1.unsubscribe();
}, 250);
Skirtingai nuo karšto Observable (Hot Observable), kuris pradeda skleisti reikšmes iš karto, nepriklausomai nuo prenumeratorių, ir visi prenumeratoriai gauna reikšmes nuo prisijungimo momento, šaltas Observable išsaugo ir atkartoja visą duomenų srautą kiekvienam naujam prenumeratoriuui. Ši savybė artina jį prie JavaScript Observable koncepcijos (RxJS ir panašių bibliotekų kontekste).
Supaprastintas palyginimas:
| Savybės | Šaltas Observable | Karštas Observable |
|---|---|---|
| Pradžia iš karto | Priėmus prenumeratą | Iš karto |
| Srautas prenumeratoriams | Visas duomenų srautas kiekvienam | Reikšmės nuo prisijungimo momento |
| Naudojimas | HTTP užklausos, failų skaitymas, iteracijos | DOM įvykiai, web-socketai, laikmačiai |