Home Reference Source

props/containers/models.js

const store = {}
const listeners = {}
class Store {
  constructor (name, model) {
    this.name = name
    this.Model = model
    this.models = {}
    this._referenceListeners = (listeners[this.name] && listeners[this.name].referenceModel instanceof Array) ? listeners[this.name].referenceModel : []
    delete listeners[this.name]
  }

  add (items = []) {
    while (items.length) {
      const item = items.shift()
      if (item instanceof this.Model && item._pKey) {
        this.models[item[item._pKey].toString()] = item
        const listeners = this._referenceListeners.filter(listener => listener.id === item._pKey)
        while (listeners.length) {
          const listener = listeners.shift()
          listener.resolve(item)
        }
        this._referenceListeners = this._referenceListeners.filter(listener => listener.id !== item._pKey)
      }
    }
  }

  filter (predictate) {
    return Object.values(this.models).filter(predictate)
  }

  findByPKey (id) {
    if (this.models[id.toString()]) return this.models[id.toString()]
    return null
  }

  referenceModel (id, resolve = () => {}) {
    if (!id) return resolve(null)
    if (resolve) {
      if (this.models[id.toString()]) {
        resolve(this.models[id.toString()])
      } else {
        this._referenceListeners.push({ id: id.toString(), resolve })
      }
    } else {
      if (this.models[id.toString()]) {
        return this.models[id.toString()]
      } else {
        return new Promise((resolve) => {
          this._referenceListeners.push({ id: id.toString(), resolve })
        })
      }
    }
  }
}
export const register = (models) => {
  try {
    Object.keys(models).forEach(name => {
      if (!store[name]) store[name] = new Store(name, models[name])
    })
  } catch (_e) {}
  return store
}
export const referenceModel = (model, id) => {
  // console.log(model, id)
  if (store[model]) {
    return new Promise((resolve, reject) => {
      store[model].referenceModel(id, resolve)
    })
  } else {
    return new Promise((resolve, reject) => {
      if (!listeners[model]) listeners[model] = {}
      if (!listeners[model].referenceModel) listeners[model].referenceModel = []
      listeners[model].referenceModel.push({ id: id.toString(), resolve })
    })
  }
}
export default store