JavaScript: преобразование событий перед передачей их в обратный вызов - PullRequest
0 голосов
/ 16 октября 2019

В настоящее время я реализую библиотеку Bluetooth для Node.js , которая поддерживает macOS, Linux и Windows. Для достижения кросс-платформенной совместимости я использую собственный, специфичный для платформы код (Objective-C, C ++ & C), который использует Node.js 'EventEmitter и будет запускать события, когда асинхронная операция Bluetooth завершена или какое-то другое устройство вызвало событиепо какой-то причине.

Формат данных для этих событий выглядит очень по-разному, и я хотел бы их нормализовать, чтобы пользователи моей библиотеки могли получать события в одном едином формате, независимо от того, на какой платформе они находятся.

enter image description here

Конечно, я могу прикрепить обработчики событий к собственному EventEmitters, преобразовать и нормализовать данные и вызвать события с этими нормализованными данными в моемсобственная библиотека.

Проблема в том, что пользователи библиотеки смогут прикреплять и удалять события в моей библиотеке, и это означает, что, если они прикрепили событие к моей библиотеке, скажем,на «deviceDiscovered» примерно так:

const myListener = (device) => { /* ... */ };
bluetoothLibrary.on("deviceDiscovered", myListener);

Моя реализация должна выглядеть примерно так:

class BluetoothLibrary {
  nativeAdapter = getAdapterForCurrentOS();

  on(event, callback) {
    this.nativeAdapter.on(event, (data) => {
      const normalizedData = this.normalize(data)
      callback(normalizedData);
    });
  }

  off(event, callback) {
    this.nativeAdapter.off(event, callback)
  }

  normalize(data) {
    /* ... */
  }
}

Проблема в том, что если кто-то захочет удалить своих слушателей событийснова, вот так:

const myListener = (device) => { /* ... */ };
bluetoothLibrary.on("deviceDiscovered", myListener);
bluetoothLibrary.off("deviceDiscovered", myListener);

Из-за моей реализации слушатель никогда не будет действительно удален, потому что я никогда не прикрепляю ссылку на обратный вызов, который был передан мне, к нативному адаптеру EventEmitter.

Мне интересно, есть ли способ преобразовать или передать события через некоторые преобразования на пути перед передачей их слушателю событий? .

...