Sobes.tech
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 իրադարձություններ, վեբ սոկետներ, ժամացույցներ