BaseModel.ts 1.83 KB
import ArrayUtils from "../../uitl/ArrayUtils";

/*
* name;
*/
export default class BaseModel {
    protected _data: any = {};
    private updateArr: Array<Function> = [];
    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 = {};
    }
}