@difizen/magent-core
Version:
40 lines (31 loc) • 879 B
text/typescript
import { Deferred, injectable } from '@difizen/mana-app';
()
export abstract class DeferredModel<T = any> {
ready: Promise<T>;
protected readyDeferred: Deferred<T> = new Deferred<T>();
constructor() {
this.ready = this.readyDeferred.promise;
}
}
()
export abstract class AsyncModel<T = any, O = any> {
ready: Promise<T>;
protected readyDeferred: Deferred<T> = new Deferred<T>();
constructor() {
this.ready = this.readyDeferred.promise;
}
initialize(option: O) {
setImmediate(() => {
if (this.shouldInitFromMeta(option)) {
this.fromMeta(option);
} else {
this.fetchInfo(option);
}
});
}
abstract shouldInitFromMeta(option: O): boolean;
protected fromMeta(option: O) {
this.readyDeferred.resolve(this as unknown as T);
}
abstract fetchInfo(option: O): Promise<void>;
}