events icon indicating copy to clipboard operation
events copied to clipboard

Implement `events.on`

Open goto-bus-stop opened this issue 5 years ago • 2 comments

https://nodejs.org/api/events.html#events_events_on_emitter_eventname

Introduced in Node.js 13.6.0, require('events').on creates an Async Iterator over all the emits of an event.

goto-bus-stop avatar Aug 06 '20 12:08 goto-bus-stop

I am trying to code a fromEventEmitter function however it only iterates over one element even when two events are fired in succession.


export function fromEventEmitter<EventDef extends Array<unknown> = unknown[]>(
  emitter: EventEmitter,
  eventName: string,
  config: { closeEventName: string } = { closeEventName: "close" }
) {
  return (async function* (): AsyncIterable<EventDef> {
    let isOpen = true;
    emitter.once(config.closeEventName, () => (isOpen = false));
    while (isOpen) {
      console.log("cc", isOpen);
      yield await new Promise((resolve) => {
        const handler = (...args: any[]) => {
          // pauseable.pause(emitter);
          resolve((args as unknown) as EventDef);
          setTimeout(() => {}, 0);
        };
        emitter.on(eventName, handler);
        // pauseable.resume(emitter);
      });
    }
  })();
    peer.port.emit("incoming", {
      id: "1",
      path: ["viewport2", "viewport1"],
      message: {
        type: IMessageType.REQUEST,
        payload: {},
      },
    } as IRoutePacket<unknown>);
    peer.port.emit("incoming", {
      id: "2",
      path: ["viewport2", "viewport1"],
      message: {
        type: IMessageType.REQUEST,
        payload: {},
      },
    } as IRoutePacket<unknown>);

I'm just trying to convert a EventEmitter into AsyncIterator

abhishiv avatar Oct 28 '20 09:10 abhishiv

Hi! Is there an update that can be shared regarding this? I would also like to see this implemented. Even workarounds are appreciated. Thank you!

tbwiss avatar Dec 22 '22 08:12 tbwiss