【promise+单例模式】懒加载接口数据

68 阅读1分钟

背景

获取数据源接口,每次接口获取的数据内容一致【配置项、地址数据等】,但数据又会在不同的页面、或者不同的组件之间多次使用,每次调用会浪费网络资源,较优的做法懒加载接口,仅请求一次接口

思路与实现

使用单例模式,借助promise的resolve状态 缓存数据。代码示例如下:

import { reactive } from 'vue'
import http from '@http';

class AreaInfo {
  areaDetailInfo = reactive({})

  _initPromise = null

  async init(refresh = false){
    if(this._initPromise && !refresh){
      return this._initPromise
    }
    this._initPromise = new Promise(async (resolve, reject) =>{
      const { success, obj } = await http.request('xxxxxxx')
      if(success && obj){
        resolve(obj)
      }
      resolve({})
    })
    return this._initPromise
  }
  
  async getAreaInfo(){
    const res = await this.init()
    this.areaDetailInfo = res
    console.log(this.areaDetailInfo, '地区 shuju ===>')
  }
}

const areaInfo = new AreaInfo()

export default areaInfo

使用

// 组件a:
import areaInfo from '@/modules/areaInfo.js';

const info = await  areaInfo.getAreaInfo()
// 组件b:
import areaInfo from '@/modules/areaInfo.js';

const info = await  areaInfo.getAreaInfo()

ES Module【CJS】多次引用,仅执行依次,所以AreaInfo类仅构造一次

对于数据有更改变化的,还是最好全局状态管理