56 lines
1.2 KiB
TypeScript
56 lines
1.2 KiB
TypeScript
|
export interface QueueObject {
|
||
|
animate: (...args: any[]) => Promise<any>;
|
||
|
context: any;
|
||
|
args?: any[];
|
||
|
onError?: (error: any) => void;
|
||
|
}
|
||
|
|
||
|
export class AnimationQueue {
|
||
|
private __running = false;
|
||
|
private __queueObjects: QueueObject[] = [];
|
||
|
|
||
|
push(o: QueueObject): void {
|
||
|
if (this.__running) {
|
||
|
this.__queueObjects.push(o);
|
||
|
} else {
|
||
|
this.__running = true;
|
||
|
this.__animate(o);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
clear(): void {
|
||
|
this.__queueObjects = [];
|
||
|
}
|
||
|
|
||
|
private __animate(o: QueueObject): void {
|
||
|
const __this = this;
|
||
|
try {
|
||
|
if (!o.animate) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
o.animate
|
||
|
.apply(o.context, !!o.args ? o.args : [])
|
||
|
.then(() => {
|
||
|
if (0 < __this.__queueObjects.length) {
|
||
|
const __o = __this.__queueObjects.shift();
|
||
|
if (!!__o) {
|
||
|
__this.__animate.call(__this, __o);
|
||
|
} else {
|
||
|
__this.__running = false;
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
.catch(reason => {
|
||
|
if (!!o.onError) {
|
||
|
o.onError.apply(o.context, [reason]);
|
||
|
}
|
||
|
});
|
||
|
} catch (e) {
|
||
|
if (!!o.onError) {
|
||
|
o.onError.apply(o.context, [e]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|