并发加载函数-防止接口重复提交以及查询

/*
并发加载函数 防止接口重复提交以及查询
id:唯一值
syncFunc:Promise函数
 */
const _map={}
const _startTimeMap={}
function conCurentLoad (id,syncFunc) {
  //兼容并发加载的情况
  if(!_map[id]){
    _map[id]=[];
    _startTimeMap[id]=+new Date();

    return syncFunc().then(function (res) {
      setTimeout(function () {
        if(_map[id].length>0){
          _map[id].forEach(function (callback) {
            callback(res)
          })
        }
        delete _map[id]
      },0)
      return res;
    })
  }else{
    const now=+new Date();
    //10秒超时处理
    if(now-_startTimeMap[id]<10000){
      return new Promise(function (resolve) {
        _map[id].push(resolve)
      });
    }else{
      return syncFunc();
    }
  }
}

//demo
conCurentLoad(2,function () {
  return new Promise(function (resolve) {
    setTimeout(function () {
      resolve(22)
    },100)
  })
}).then(function (res) {
  console.log(res)
})
conCurentLoad(2,function () {
  return new Promise(function (resolve) {
    setTimeout(resolve,100)
  })
}).then(function (res) {
  console.log(res)
})

  

原文地址:https://www.cnblogs.com/caoke/p/14186793.html