Есть ли способ установить событие во всех функциях класса / объекта, где слушатель получит имя и параметры функции? - PullRequest
0 голосов
/ 20 ноября 2018

Есть ли способ установить событие для всех функций класса / объекта, когда слушатель получит имя и параметры функции?

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

Цель этого, и я, возможно, иду по сложному пути, состоит в том, чтобы назначить кеширование на уровне объекта для функции. Допустим, у меня есть сервисная функция, которая вызывает метод sequelize для nodejs, например, я бы хотел кешировать ее в течение x минут. Поэтому прослушиватель выше будет писать в redis с помощью ttl и проверять redis каждый раз, когда вызывается функция.

Я сделал это со Scala без стандартного кода, используя аннотации для обозначения ttl для любого метода и макросов для этого скучного набора и перехода к redis. Не уверен, как это сделать, используя javascript / nodejs.

Заранее извините, если это неуместный вопрос переполнения стека, но может помочь любое общее направление.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы в основном ищете декоратор (который в настоящее время Черновик 2-го этапа , поэтому еще не является частью языка).

Однако - используя прокси, вы можете создать что-то подобное:

class MyClass {
  func1() {
    console.log('run func1');
  }
  func2() {
    console.log('run func2');
  }
}

m = new MyClass();

var p = new Proxy(m, {
    get: function(target, name, receiver) {
      if (typeof target[name] == 'function') {
        console.log('wrapper on', name);
        return target[name]
      }
    }
});

p.func1();
p.func2();
0 голосов
/ 20 ноября 2018

Современный подход к выполнению этого с помощью JavaScript - через прокси-объект. Вот описание их из документов:

Объект Proxy используется для определения пользовательского поведения для фундаментального операции ( например, поиск свойства, присваивание, перечисление, функция вызов и т. д.).

Здесь:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

...