Рекомендации: добавление двух прослушивателей событий в событие, где один прослушиватель требует переданного параметра, а другой-нет

#typescript #events #event-handling

#машинописный текст #Мероприятия #обработка событий

Вопрос:

Может быть, это простой вопрос, но у меня есть событие, давайте назовем его addObject . Я испускаю это событие, и у меня есть два слушателя для него. Один слушатель требует, чтобы константа «важный объект» была передана, но другой этого не делает. Так что у меня есть что-то вроде

 myFunction1() {  const importantObject = {...};  // other logic  this.emit('addObject');  this.emit('addObjectWithParam', importantObject); }  myFunction2() {  //other logic  const forceUpdate = this.forceUpdate.bind(this);  this.addListener('addObject', forceUpdate); }  myFunction3() {  this.addListener(  'addAuditTest',  this.handlerFunction.bind(this),  ); }  

Это похоже на преодоление барьера абстракции, дважды испустив «AddObject», но я делаю это, потому forceUpdate() что не принимает параметров, но мне это нужно importantObject handlerFunction() .

Что здесь самое чистое/лучшие практики?

Ответ №1:

Это скорее вопрос более высокого уровня, но я постараюсь ответить как можно лучше.

Просто вопрос, который я бы задал себе с точки зрения «бизнеса» или «домена», являются ли они одним и тем же событием или нет.

С точки зрения обработки событий / событий не должно иметь значения, нужны ли слушателю аргументы события. Важно то, каковы сами события.

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

У меня есть два потребителя:

  1. Вызов api с выбором пользователей. Для этого потребуется выбранное значение
  2. Вызов API аналитики показывает, что пользователь изменил свой выбор. Для этого может не потребоваться значение выбора.

В этом случае, если потребителю все равно, он просто игнорирует аргумент. Нам не нужно предоставлять разные мероприятия для одного и того же onSelect .

Однако вам нужно убедиться, что они действительно одинаковы. Другой пример-это onMouseUp vs onClick .

onClick Событие может не иметь аргумента, так как оно просто информирует о том, что пользователь нажал кнопку. Где, как onMouseUp может быть, есть информация о местоположении мыши или что-то еще.

Они оба могут быть использованы для обнаружения щелчка, но это принципиально разные события.

Вам просто нужно выяснить, являются ли они одним и тем же событием с разными потребностями потребителей или одним и тем же событием.