combineEvents
import { combineEvents } from 'patronum';// orimport { combineEvents } from 'patronum/combine-events';combineEvents(events)
Motivation
combineEvents is useful when you need to wait for several independent events and react only after each of them has emitted at least once.
You can think of it as a Promise.all for events.
This is helpful, when you need to:
- wait for several API calls to finish (user profile, settings, feature flags),
- collect values from different parts of the UI (step 1, step 2, step 3),
- synchronise independent flows before continuing.
Formulae
const target = combineEvents({ key1: event1, key2: event2 });- When all events are triggered, trigger
targetwith{key1: firstPayload, key2: secondPayload}
const target = combineEvents([event1, event2]);- When all events are triggered, trigger
targetwith[firstPayload, secondPayload]
Arguments
events— Object or array with events
Returns
target— Event with the same shape asevents, that triggered after alleventstriggered
combineEvents({ events, reset, target })
Motivation
This overload is useful when you:
- already have a
targetunit (event, effect or store) that should receive the combined payload, and - want to control when
combineEventsshould start collecting payloads from scratch using aresetunit.
Typical use-cases:
- reuse an existing
targetevent instead of creating a new one, - manually restart waiting for all events after an error or user action.
Formulae
combineEvents({ events: { key1: event1, key2: event2, }, reset: resetUnit, target: targetUnit,});- When all events are triggered, trigger
targetwith{key1: firstPayload, key2: secondPayload} - When resetUnit is triggered, internal state is cleared and
combineEventsstarts waiting for all events again
combineEvents({ events: [event1, event2], reset: resetUnit, target: targetUnit,});- When all events are triggered, trigger
targetwith[firstPayload, secondPayload] - When
resetUnitis triggered, internal state is cleared andcombineEventsstarts waiting for all events again
Arguments
events— Object or array with eventsreset(Unit<any>)- Optional. Any unit which will reset state ofcombineEventsand collecting of payloads will start from scratchtarget(Unit<Shape>)- Optional. Any unit with type matchingeventsshape
Returns
target— Iftargetis not provided, a new event with the same shape aseventsis created and returned. Iftargetis provided, the same unit is returned back.
Example
const first = createEvent<number>();const second = createEvent<string>();const third = createEvent<boolean>();const target = createEvent<{ a: number; b: string; c: boolean }>();const reset = createEvent();
combineEvents({ events: { a: first, b: second, c: third, }, reset, target,});
target.watch((object) => { console.log('first event data', object.a); console.log('second event data', object.b); console.log('third event data', object.c);});
first(15); // nothingsecond('wow'); // nothingthird(false); // target triggered with {a: 15, b: 'wow', c: false}
first(10);second('-');
reset(); // combineEvents state is erased
third(true); // nothing, as it's a first saved payloadfirst(0);second('ok'); // target triggered with {a: 0, b: 'ok', c: true}