browserify / events

Node's event emitter for all engines.
MIT License
1.38k stars 173 forks source link

Implement `events.on` #76

Open goto-bus-stop opened 4 years ago

goto-bus-stop commented 4 years ago

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.

abhishiv commented 3 years ago

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

tbwiss commented 1 year ago

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!