Sobes.tech
Middle+

Na koju strukturu podataka u JavaScript-u liči objekat Observable?

sobes.tech АИ

Одговор од АИ

Структура података хладни Observable (на енглески Cold Observable), која је концепт из реактивног програмирања (на пример, у библиотечком 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 чува и репродукује цео ток података за сваког новог претплатника. Ова карактеристика га приближава концепту Observable у JavaScript-у (у контексту RxJS и сличних библиотека).

Сажетак (поједностављено):

Карактеристика Хладни Observable Горићи Observable
Почетак емитовања При претплати Одмах
Ток за претплатнике Пун ток података за сваког Вредности од тренутка претплате
Коришћење HTTP захтеви, читање фајлова, итерације DOM догађаји, веб сокети, таймери