Store может хранить callbacks в Set и уведомлять их при присваивании нового data через setter.
class Store {}
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.