how to call method dynamically

Donghun Seol·2023년 4월 6일
0

블록체인 이벤트 리스너에 다음과 같이 작성된 코드가 있다.
수신되는 이벤트에 따라서 호출되는 메서드가 달라진다.
if, else가 떡칠된 너무 못난 코드라서 개선하고 싶었지만 실력부족으로 이대로 방치.....


for await (let event of allEvents) {
  const { transactionHash } = event;
  if (await this.isTxProcessed(transactionHash)) continue;
  if (event.event === 'Create') {
    console.log('Create Event found!');
    await this.createEventHandler(event, false);
  } else if (event.event === 'Accept') {
    console.log('Accept Event found!');
    await this.acceptEventHandler(event, false);
  } else if (event.event === 'Cancel') {
    console.log('Cancel Event found!');
    await this.cancelEventHandler(event, false);
  } else if (event.event === 'Claim') {
    console.log('Claim Event found!');
    await this.claimEventHandler(event, false);
  } else if (event.event === 'Close') {
    console.log('Close Event found!');
    await this.closeEventHandler(event, false);
  } else if (event.event === 'Expire') {
    console.log('Expire Event found!');
    await this.expireEventHandler(event, false);
  } else if (event.event === 'PayPremium') {
    console.log('PayPremium Event found!');
    await this.payPremiumEventHandler(event, false);
  } else {
    /* ... */
  }

예전 프로젝트 코드를 천천히 살펴보다가 이대로 두긴 너무 부끄러워서 여기저기 뒤적거리다 답을 찾았다.

클래스에 메서드가 존재하는지 여부를 판단해서, 해당 이벤트가 수신가능한지 파악하고,
bracket notation을 사용해서 호출했다.
따라서 위의 코드는 아래와 같이 개선가능하고, 100개의 이벤트를 수신하더라도 이 부분은 수정할 필요가 없어졌다.
이제 좀 마음에 든다.😎

for await (let event of allEvents) {
  const { transactionHash } = event;
  if (await this.isTxProcessed(transactionHash)) continue;
  
  const eventHandlerName = `${event.event.toLowerCase()}EventHandler`
  if (!this.prototype.hasOwnProperty(eventHandlerName)) {
    throw new Error('unregisterd event!')
  }
  
  await this.[eventHandlerName](event, false);
}
profile
I'm going from failure to failure without losing enthusiasm

0개의 댓글