Skip to content

Instantly share code, notes, and snippets.

@maurocen
Last active July 12, 2022 17:02
Show Gist options
  • Save maurocen/de607c3a4b75b03e97513c7d25488851 to your computer and use it in GitHub Desktop.
Save maurocen/de607c3a4b75b03e97513c7d25488851 to your computer and use it in GitHub Desktop.
Get a promise that resolves/rejects when the specified `accepted` or `rejected` events are received.
const EventEmitter = require('events');
const event = new EventEmitter();
// THIS IS THE IMPORTANT BIT
const eventPromise = (accepted, rejected, acceptMessage = '', rejectMessage = '') => new Promise((resolve, reject) => {
event.on(accepted, (...args) => {
event.removeAllListeners(accepted);
event.removeAllListeners(rejected);
resolve([acceptMessage, ...args]);
});
event.on(rejected, (...args) => {
event.removeAllListeners(accepted);
event.removeAllListeners(rejected);
reject([rejectMessage, ...args]);
});
});
// FROM HERE ON IT'S JUST A DEMONSTRATION
function test(code) {
const testValue = Math.random();
const pass = testValue > 0.7;
setTimeout(() => {
event.emit(`${pass ? 'accepted' : 'rejected'}-${code}`, testValue);
}, 200 + Math.random() * 1000);
};
const wait = async () => {
try {
const numbers = (new Array(100)).fill(0).map((_a, i) => i);
const promises = await Promise.allSettled(
numbers.map((number) => {
test(number);
return eventPromise(
`accepted-${number}`,
`rejected-${number}`,
`ACCEPTED EVENT ${number}`,
`REJECTED EVENT ${number}`,
);
})
);
console.table(promises);
} catch (error) {
console.log(error);
}
}
wait();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment