import ArrayUtils from "../../uitl/ArrayUtils"; /* * name; */ export default class BaseModel { protected _data: any = {}; private updateArr: Array = []; private keyUpdateArr: any = {}; public async update(data: any) { this._data = { ...this._data, ...data } this.updateArr.forEach(func => { func(this._data); }) for (let key in this.keyUpdateArr) { let value = data[key]; if (value != null) { let arr = this.keyUpdateArr[key]; arr && arr.forEach(func => { func(value); }) } } } public waitFor(key: string) { return new Promise(resolve => { let value; value = this._data[key]; if (value) { resolve(value); return; } let cb = data => { if (data) { resolve(data); this.offUpdate(cb, key); } } this.onUpdate(cb, key, true); }) } public onUpdate(func: Function, key?: string, run: boolean = true) { if (key) { let value = this._data[key]; run && value != null && func(value); let arr = this.keyUpdateArr[key]; !arr && (this.keyUpdateArr[key] = arr = []); arr.push(func); } else { run && func(this._data); this.updateArr.push(func); } } public offUpdate(func: Function, key?: string) { if (key) { ArrayUtils.removeFromArr(this.keyUpdateArr[key], func); } else { ArrayUtils.removeFromArr(this.updateArr, func); } } public clearGame() { this._data = {}; } }