Middle+
Ի՞նչ տվյալների կառուցվածքի հետ է նմանակող JavaScript-ում օբյեկտը Observable- ը։
sobes.tech AI
Պատասխան AI-ից
Տվյալների կառուցվածքը ցուրտ Observable (անգլերեն՝ Cold Observable), որը հանդիսանում է կոնցեպտ Reactivex ծրագրավորման (օրինակ՝ RxJS գրադարանի մեջ):
Հիմնական նմանություններ՝
- Անգործուն բնույթ: Observable-ը սկսում է արտանետել արժեքներ միայն այն ժամանակ, երբ կա գրանցված բաժանորդ (subscriber): Բացակայում դեպքում, Observable-ը չի ակտիվանում:
- Բազմաթիվ բաժանորդներ, անկախ հոսքեր: Յուրաքանչյուր նոր բաժանորդ ստանում է ամբողջ արժեքների հավաքածուն սկզբից, անկախ մյուսներից: Սա ստեղծում է անկախ տվյալների հոսքեր յուրաքանչյուր բաժանորդի համար:
Օրինակ՝ սառը observable-ի կառուցվածքը (գաղափարականորեն):
// Կարծես թե սա մի "արտադրիչ" է արժեքների
function generateValues() {
let i = 0;
return {
// մեթոդ, որը վերադարձնում է հաջորդ արժեքը (երբ պահանջվում է)
next: function() {
return { value: i++, done: false };
}
};
}
// "Observable" - հիմնականում, պարզապես ֆունկցիա, որը ընդունում է բաժանորդին
function coldObservableExample(subscriber) {
const generator = generateValues();
// արժեքների արտանետման սիմուլյացիա
setTimeout(() => {
subscriber.next(generator.next().value);
}, 100);
setTimeout(() => {
subscriber.next(generator.next().value);
}, 200);
setTimeout(() => {
subscriber.complete(); // հոսքի ավարտ
}, 300);
// վերադարձնում է բաժանորդագրման օբյեկտ (բացառելու համար)
return {
unsubscribe: () => {
console.log('Բացառում');
// այստեղ կարող է լինել տրամաբանություն գեներատորի/ժամանակաչափերի փակման համար
}
};
}
// Բաժանորդ 1
const subscription1 = coldObservableExample({
next: (value) => console.log('Բաժանորդ 1 ստացել է:', value),
error: (err) => console.error('Սխալ 1:', err),
complete: () => console.log('Բաժանորդ 1 ավարտված է')
});
// Բաժանորդ 2 (սկսելու է ստանալ արժեքներ սկզբից)
setTimeout(() => {
const subscription2 = coldObservableExample({
next: (value) => console.log('Բաժանորդ 2 ստացել է:', value),
error: (err) => console.error('Սխալ 2:', err),
complete: () => console.log('Բաժանորդ 2 ավարտված է')
});
}, 150);
// Առաջին բաժանորդից դուրս գրանցում
setTimeout(() => {
subscription1.unsubscribe();
}, 250);
Ի տարբերություն գոլդ Observable (Hot Observable), որը սկսում է արտանետել արժեքներ անմիջապես, անկախ բաժանորդներից, և բոլոր բաժանորդները ստանում են արժեքները գրանցման պահին, սառը Observable-ը պահպանում և վերարտադրում է ամբողջ տվյալների հոսքը յուրաքանչյուր նոր բաժանորդի համար: Այս հատկությունը մոտեցնում է այն JavaScript-ի Observable կոնցեպտին (RxJS և նման գրադարանների համատեքստում):
Ստորև ներկայացված է պարզեցված համեմատություն՝
| Գծագրություն | Սառը Observable | Գոլդ Observable |
|---|---|---|
| Հիմնարկը արտանետման | Գրանցման ժամանակ | Ուղիղ |
| Հոսք բաժանորդների համար | Հավաքածու ամբողջ հոսք յուրաքանչյուրին | Արժեքներ գրանցման պահից սկսած |
| Օգտագործում | HTTP հարցումներ, ֆայլերի ընթերցում, կրկնություն | DOM իրադարձություններ, վեբ սոկետներ, ժամացույցներ |