Size: a a a

JavaScript Noobs — сообщество новичков

2020 August 05

IB

Ivan Bobchenkov in JavaScript Noobs — сообщество новичков
Была только идея, добавить в самый низ родительского метода этот if, но как-то такое
источник

KP

Kotan 🐱 Pupkin in JavaScript Noobs — сообщество новичков
не понял, в чём у тебя проблема. В классе BroadcastEventEmitter переопределяешь метод emit, в котором делаешь проверку равенства eventName и "*". Если не равно (обычный ивент), то делаешь super.emit(args).
источник

KP

Kotan 🐱 Pupkin in JavaScript Noobs — сообщество новичков
или я не так понял задачу?
источник

IB

Ivan Bobchenkov in JavaScript Noobs — сообщество новичков
Kotan 🐱 Pupkin
не понял, в чём у тебя проблема. В классе BroadcastEventEmitter переопределяешь метод emit, в котором делаешь проверку равенства eventName и "*". Если не равно (обычный ивент), то делаешь super.emit(args).
Я пытался переопределять, но при вызове - просто не видит
источник

IB

Ivan Bobchenkov in JavaScript Noobs — сообщество новичков
И вызывает напрямую родительский
источник

j

jk in JavaScript Noobs — сообщество новичков
Ivan Bobchenkov
Спасибо за помощь, вроде переписал как надо, сможешь глянуть ещё разок?
https://codepen.io/SpeedWagon_S/pen/BaKapzR
И там просят каким-то образом расширить с помощью наследника класс так, чтобы в него добавился этот if('*'), уже много чего перечитал, но так и не понимаю как это сделать :(
off должен удалять и on и once. apply не обязателен при вызове функций через emit, просто добавь спред обратно из массива аргументов. Можешь подчищать пустые Set.
источник

KP

Kotan 🐱 Pupkin in JavaScript Noobs — сообщество новичков
Ivan Bobchenkov
Я пытался переопределять, но при вызове - просто не видит
:O щас проверю
источник

IB

Ivan Bobchenkov in JavaScript Noobs — сообщество новичков
jk
off должен удалять и on и once. apply не обязателен при вызове функций через emit, просто добавь спред обратно из массива аргументов. Можешь подчищать пустые Set.
Просто по условию, я должен принимать много аргументов, там где '*'
источник

IB

Ivan Bobchenkov in JavaScript Noobs — сообщество новичков
Поэтому и выбрал apply, ибо он как раз с массивами работает
источник

j

jk in JavaScript Noobs — сообщество новичков
Ivan Bobchenkov
Поэтому и выбрал apply, ибо он как раз с массивами работает
Это понятно, я просто имею в виду более лаконичное решение.

function emit (...args) {
 callback(...args)
}
источник

IB

Ivan Bobchenkov in JavaScript Noobs — сообщество новичков
jk
Это понятно, я просто имею в виду более лаконичное решение.

function emit (...args) {
 callback(...args)
}
Понял
источник

KP

Kotan 🐱 Pupkin in JavaScript Noobs — сообщество новичков
Не хочу на кодепен регаться, поэтому так
источник

KP

Kotan 🐱 Pupkin in JavaScript Noobs — сообщество новичков
скрипт в консоли пишет
"foo"
"foo"
"bar"
источник

IB

Ivan Bobchenkov in JavaScript Noobs — сообщество новичков
Kotan 🐱 Pupkin
скрипт в консоли пишет
"foo"
"foo"
"bar"
Да, все правильно, просто я додик, не правильно понял как тесты крутятся, я думал что он не наследует новый класс, а пользуется только родительским :D
источник

IB

Ivan Bobchenkov in JavaScript Noobs — сообщество новичков
Ибо и там и там был emitter, и думал что он его не переопределяет
источник

IB

Ivan Bobchenkov in JavaScript Noobs — сообщество новичков
Спасибо всем, очень помогли :)
источник

j

jk in JavaScript Noobs — сообщество новичков
Ivan Bobchenkov
Спасибо за помощь, вроде переписал как надо, сможешь глянуть ещё разок?
https://codepen.io/SpeedWagon_S/pen/BaKapzR
И там просят каким-то образом расширить с помощью наследника класс так, чтобы в него добавился этот if('*'), уже много чего перечитал, но так и не понимаю как это сделать :(
Можно даже что-то подобное

class BroadcastEventEmitter extends EventEmitter {
 emit (eventName, ...args) {
   if (eventName === '*') {
     const eventNames = new Set([
       ...Object.keys(this.events),
       ...Object.keys(this.eventsOnce)
     ])
     eventNames.forEach(name => super.emit(name, ...args))
   } else {
     super.emit(eventName, ...args)
   }
 }
}
источник

IB

Ivan Bobchenkov in JavaScript Noobs — сообщество новичков
jk
Можно даже что-то подобное

class BroadcastEventEmitter extends EventEmitter {
 emit (eventName, ...args) {
   if (eventName === '*') {
     const eventNames = new Set([
       ...Object.keys(this.events),
       ...Object.keys(this.eventsOnce)
     ])
     eventNames.forEach(name => super.emit(name, ...args))
   } else {
     super.emit(eventName, ...args)
   }
 }
}
Да, выглядит мощно
источник

j

jk in JavaScript Noobs — сообщество новичков
Да, у тебя там ещё прикол.  else if (eventsOnce) { ты по emit выполняешь только из одной группы, а надо из двух.
источник

IB

Ivan Bobchenkov in JavaScript Noobs — сообщество новичков
jk
Да, у тебя там ещё прикол.  else if (eventsOnce) { ты по emit выполняешь только из одной группы, а надо из двух.
Чтобы и у той группы, и у той удалились все слушатели после выполнения?
источник