/* 并发加载函数 id:唯一值 syncFunc:加载函数 */ const _map={} const _startTimeMap={} async function conCurentLoad (id,syncFunc) { //兼容并发加载的情况 if(!_map[id]){ _map[id]=[]; _startTimeMap[id]=+new Date(); const res = await syncFunc(); 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(); } } } //加载组合数据 async function loadGroup(data) { if(typeof data==='object'){ for(let k in data){ if(Object.prototype.toString.call(data[k])==='[object Promise]'){ data[k]=await data[k]; } if(typeof data[k]==='object'){ data[k]=await loadGroup(data[k]) } } } return data } //定义 function defineModal(data,_ajax){ //唯一标识 let id=Symbol('id') return new Proxy(data, { get(target, key) { if(target.hasLoad||target.hasOwnProperty(key)){ return target[key] } return conCurentLoad(id,async function () { const data=await _ajax() Object.assign(target,data) target.hasLoad=true; return target }).then(function () { return target[key]; }) } }) } //定义有请求的数据源 const User =defineModal({ name:215 },function () { return new Promise(function (resolve) { setTimeout(function () { resolve({ name:'user', list:[ { a:'a' } ] }) },100) }) }) //Page modal let Page = { page:User.list }; let Tmp = { page:Page }; async function init(){ const data={ TmpPage:Page.page, Tmp } //从模板中读取到的字符 const tmpStrs=['Tmp.page','TmpPage'] const func=new Function('data', `with(data){return [${tmpStrs.join(',')}]}`) const arr=await loadGroup(func(data)) console.log(arr) console.log(User.name) //接口模式 // const name=await loadGroup({ // name:Tmp.page.page, // name2:User.list, // arr:[{ // d:User.name // },User.name] // }) // console.log(name); } init() //加载模板,解析出数据源 //处理数据源,返回数据 //渲染页面或者json