JSFiddle - React, Tailwind, and code Playground

HTML

<button id="btn">
  Click me
</button>

Babel + JSX

console.clear();

class EventPropagation {
  constructor(id) {
    const button = document.getElementById(id);
    let _resolve;

    button.addEventListener("click", event => {
      if (_resolve) {
        _resolve(event);
      }
    });

    let _listen = () => {
      return new Promise(resolve => {
        _resolve = resolve;
      });
    }

    this.subscribe = async function*() {
      const result = await _listen();
      yield result;
      yield * this.subscribe();
    }
  }
}

async function example() {
  const eventPropagation = new EventPropagation("btn");
  for await (const event of eventPropagation.subscribe()) {
    console.log(event);
  }
}

// call the example function
example();