class Store {}

Store может хранить callbacks в Set и уведомлять их при присваивании нового data через setter.

Короткий ответ

Что ответить на собеседовании

Store может хранить callbacks в Set и уведомлять их при присваивании нового data через setter.

Подробный разбор

Ответ с пояснениями

Условие

class Store {}

const store = new Store()

// Пример использования

const firstSubscriber = (data) => console.log('first', data) const secondSubscriber = (data) => console.log('second', data)

store.subscribe(firstSubscriber) store.subscribe(secondSubscriber)

store.data = {newKey: 'newString'}

// CONSOLE // first { newKey: 'newString' } // second { newKey: 'newString' }

store.unsubscribe(firstSubscriber)

store.data = {lastKey: 'lastKey'}

// CONSOLE // second { lastKey: 'lastKey' }

Ответ

Store может хранить callbacks в Set и уведомлять их при присваивании нового data через setter.

В примере уведомляется именно присваивание store.data; вложенная мутация объекта не отслеживается. Подписка сама ничего не выводит.

class Store {
  #data = {};
  #subscribers = new Set();
  get data() { return this.#data; }
  set data(value) {
    this.#data = value;
    const errors = [];
    for (const subscriber of [...this.#subscribers]) {
      try { subscriber(value); }
      catch (error) { errors.push(error); }
    }
    if (errors.length) throw new AggregateError(errors, 'Ошибки подписчиков');
  }
  subscribe(fn) { this.#subscribers.add(fn); }
  unsubscribe(fn) { this.#subscribers.delete(fn); }
}

Снимок Set делает текущий обход независимым от добавления подписчиков. Ошибки собираются после уведомления всех; для AggregateError требуется ES2021.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее