Skip to content

johnvmt/queue-emitter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Queue Emitter

Emit events in series, rather than in parallel Functions can be asynchronous (next function will start after the first function's Promise resolves) Functions can halt the emitter

Note: values returned by the functions are ignored. The arguments passed are the ones passed into the emit function

Usage

2 Functions, One asynchronous

const emitter = new QueueEmitter();

function callback1(obj) {
	obj.key1 = 'val1';
}

async function callback2(obj) {
	return new Promise(async function(resolve, reject) {
		setTimeout(() => {
			obj.key2 = 'val2';
			resolve();
		}, 100);
	});
}

emitter.on('eventname', callback1);
emitter.on('eventname', callback2);

let obj = {
	key0: 'val0'
};

await emitter.emit('eventname', obj);

if(obj.key0 !== 'val0' || obj.key1 !== 'val1' || obj.key2 !== 'val2')
	throw new Error('values not set properly');

Reject in one callback

const emitter = new QueueEmitter();

function callback1(obj) {
	obj.key1 = 'val1';
}

async function callback2(obj) {
	throw new Error('some_error')
}

emitter.on('eventname', callback1);
emitter.on('eventname', callback2);

try {
	await emitter.emit('eventname', {});
}
catch(error) {
	if(error.message !== 'some_error')
		throw error;
}

Useage with 'once'

const emitter = new QueueEmitter();

let triggered = false;
function callback1(obj) {
	if(triggered)
		throw new Error('previously_triggered');
	triggered = true;
}

emitter.once('eventname', callback1);

await emitter.emit('eventname', {});
await emitter.emit('eventname', {});

About

Run functions in series on events

Resources

License

Stars

Watchers

Forks

Packages

No packages published