c2ff7882bc
* FIX: database test with sqlite * more types * filter test * split filter parser * filter test * filter test: hasMany * define inverse association for belongsTo & hasMany * chore: console.log * repository count method * chore: Collection * repository filter & appends & fields & expect * repository: sort option * chore: test * add: test * find & findAndCount * chore: test * database-next: update guard * database-next: update guard associationKeysToBeUpdate * chore: comment * update-guard OneToOne Association * has one repository * support through table value * belongs to many repository * has many repository * has many repository find * fix: has many find and count * clean code * add count method * chore: multiple relation * chore: single relation * repository find * relation repository builder * repository count * repository count test * fix test * close db afterEach test * sort with associations * repository update * has many repository: destroy * belongs to many repository: destroy * add transaction decorator * belongs to many with transaction * has many with transaction * clean types * clean types * clean types * repository transaction * fix test * single relation repository with transaction * single relation repository with transaction * fix: test * fix: option parser fields append * fix: typo * fix: string type * fix: import * collection field methods * cleanup * collection sync * fix: import * fix: test * collection update field * collection update options * database hook * database test * database event test * update database event * add async emmit mixin * async model event * database import * fix: model hook type * fix: collection event * recall model.init on collection update * skip redefine collection test * skip collection model update * add model hook class * global model event support * chore * chore * change utils import * add field types * database import * more import test * test case * fix: through model init... * bugfix * fix * update database import * collection sync by foreachModel * fix collection model sync * update * add field types * custom operator * sqlite array field * postgresql array field * array query escape * mysql array operators * date operators * array field sqlite fix * association operator * date operator empty & notEmpty * fix: fields import * fix array field nested association * filter parse prepare * fix test * string field empty * add date operator test * field option types * fix typo * fix: operator name conflict * rename function Co-authored-by: Chareice <chareice@live.com>
53 lines
1.3 KiB
TypeScript
53 lines
1.3 KiB
TypeScript
export class AsyncEmitter {
|
|
async emitAsync(event: string | symbol, ...args: any[]): Promise<boolean> {
|
|
// @ts-ignore
|
|
const events = this._events;
|
|
let callbacks = events[event];
|
|
if (!callbacks) {
|
|
return false;
|
|
}
|
|
// helper function to reuse as much code as possible
|
|
const run = (cb) => {
|
|
switch (args.length) {
|
|
// fast cases
|
|
case 0:
|
|
cb = cb.call(this);
|
|
break;
|
|
case 1:
|
|
cb = cb.call(this, args[0]);
|
|
break;
|
|
case 2:
|
|
cb = cb.call(this, args[0], args[1]);
|
|
break;
|
|
case 3:
|
|
cb = cb.call(this, args[0], args[1], args[2]);
|
|
break;
|
|
// slower
|
|
default:
|
|
cb = cb.apply(this, args);
|
|
}
|
|
|
|
if (cb && (cb instanceof Promise || typeof cb.then === 'function')) {
|
|
return cb;
|
|
}
|
|
|
|
return Promise.resolve(true);
|
|
};
|
|
|
|
if (typeof callbacks === 'function') {
|
|
await run(callbacks);
|
|
} else if (typeof callbacks === 'object') {
|
|
callbacks = callbacks.slice().filter(Boolean);
|
|
await callbacks.reduce((prev, next) => {
|
|
return prev.then((res) => {
|
|
return run(next).then((result) =>
|
|
Promise.resolve(res.concat(result)),
|
|
);
|
|
});
|
|
}, Promise.resolve([]));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|