Инициировать событие, когда объект добавляется на карту или набор

Я ищу способ инициировать событие, когда объект добавляется на карту или набор? Как-то так, возможно? Сейчас мы просто используем таймер для проверки.

let mymap = new Map() // or Set()
mymap.on('set', obj => {
    console.info(obj) 
}

Это мой первый проход, основанный на рекомендациях @PsychoX, мысли?

const EventEmitter = require('events')
const emitter = new EventEmitter()

const Wrapper = () => {
    this._set = new Set()
    this.get = key => { return this._set.get(key) }
    this.add = obj => {
        this._set.add(obj)
        emitter.emit('add', obj)
    }
    this.values = () => { return this._set.values() }
}

emitter.on('add', obj => {
    console.info('added', obj)
})

let test = new Wrapper()
test.add({hello:'world'})

Создайте свой собственный класс-оболочку вокруг них

kellys 22.03.2022 14:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете расширить значение по умолчанию Map или использовать прокси.

Мой подход:

class ObservableMapChangeEvent extends Event {
    constructor(observable, key, oldValue, newValue) {
        super('change');
        this.observable = observable;
        this.key = key;
        this.oldValue = oldValue;
        this.newValue = newValue;
    }
}

class ObservableMap extends Map {
    constructor(iterable) {
        super(iterable);
        this._eventTarget = new EventTarget();
    }

    on(name, listener, options) {
        this._eventTarget.addEventListener(name, listener, options);
    }

    off(name, listener, options) {
        this._eventTarget.addEventListener(name, listener, options);
    }

    delete(key) {
        this._eventTarget.dispatchEvent(new ObservableMapChangeEvent(this, key, this.get(key), undefined));
        super.delete(key);
    }
    set(key, value) {
        this._eventTarget.dispatchEvent(new ObservableMapChangeEvent(this, key, this.get(key), value));
        super.set(key, value);
    }
}

// Example:
const foo = new ObservableMap();
foo.on('change', event => {
    console.info(`Changes [${event.key}] to '${event.newValue}' (old: '${event.oldValue}')`);
});
foo.set('hello', 'world'); // Changes [hello] to 'world' (old: undefined)

Возможно, вы захотите посмотреть на:

О, это меня вдохновило, чуть позже опубликую свои результаты .. большое спасибо :D

Bill Kervaski 22.03.2022 14:57

@BillKervaski О, я тоже пытался сделать это как для упражнений :D

PsychoX 22.03.2022 15:09

Спасибо! Я опубликовал свой первый проход с использованием эмиттеров событий в вопросе, глядя на ваш пример сейчас. Это отличный материал! Люблю учиться...

Bill Kervaski 22.03.2022 15:14

Я обновил свой подход в ответе (исправил несколько вещей, так как писал без тестирования). По сравнению с вашим решением, оно может быть более многоразовым. Однако я только сейчас понял, что вы отметили node js, что я проглядел, сосредоточившись на том, чтобы заставить его работать в браузере.

PsychoX 22.03.2022 15:18

Все супер, большое спасибо!!!

Bill Kervaski 22.03.2022 15:21

Ага, сегодня я узнал, что у Node тоже есть EventEmitter, так что решение будет работать и для браузера, и для Node :)

PsychoX 22.03.2022 15:27

Да, это то, что я тестирую, и оно отлично работает. Вы действительно открыли мне глаза на несколько вещей, самоучка, поэтому у меня есть пробелы: D, если бы у вас была баночка для чаевых ...

Bill Kervaski 22.03.2022 15:31

Другие вопросы по теме