UNPKG

miue-ui

Version:

ali miniProgram UI components for vehicle.

288 lines (271 loc) 7.74 kB
/** * author:dansion@163.com * data:2022-04-25 * version:V1.0.0 * * updata: 2024-05-09: 添加 request task 机制,添加 abort的操作; */ const _caches_url=new Map(); const _request_task=new Map(); const _indate= 8640000 * 30; // 缓存7天 //const caches={}; // 将json转化URL格式方 let errorInfo=(code)=>{ switch(code){ case 0: return {'code':'0','message':'网络数据无效,请稍后重试。'} break; case 9: return {'code':'9','message':'网络请求被取消。'} break; case 13: return {'code':'13','message':'请求网络超时,请检查网络后重试。'} break; case 11: return {'code':'11','message':'请求网络失败,请检查网络后重试。'} break; case 12: return {'code':'12','message':'似乎已断开网络连接,请检查网络后重试。'} break; case 14: return {'code':'14','message':'JSON 解析错误或证书异常。'} break; case 404: return {'code':'404','message':'获取服务器数据错误,请稍后重试。'} break; case 500: return {'code':'500','message':'服务器内部错误,请稍后重试。'} break; case 307: return {'code':'307','message':'网络被重定向,请检查网络后重试。'} break; case 3: return {'code':'20','message':'接口权限鉴权或证书更新失败。'} break; case 4: return {'code':'21','message':'未配置域名白名单'} break; case 5: return {'code':'23','message':'本地RSA加密无效'} break; default: return {'code':'-1','message':'末知错误'} break; } }; // 将URL进行拼接 let jsonToUrlParam=(json)=>{ return Object.keys(json).map(key => key + '=' + json[key]).join('&'); }; // 存置要缓存的URL, let setUrl=(url)=>{ _caches_url.set(url,true); return this; } //判读url是不是要缓存 let isCaches=(url)=>{ return _caches_url.get(url); } // 将URL转化成 本地存储的KEY。 let url2key=(obj)=>{ let {url,method,data,headers}=obj; let key=''; // 本地存储功能,以URL 作为KEY,POST则在原URL后添加对应 data数据 if(method=='POST'){ key = `${url}?${ jsonToUrlParam(data)}`; }else{ // get 需要对其它DATA进行处理; key= `${url}_${ jsonToUrlParam(data)}`; } /* 可能loccaStroge 的 key 不支持 冒号的情况。*/ key=key.replace(':','_'); //key=key.replace('http://','http_'); return key; } // 以 URL 为作 key,写入数据 let save=(key,data)=>{ let _expired=Date.now()+_indate; my.setStorage( { key:key, data:{data:data,expired:_expired}, success:()=>{ /** 写入成功 */}, fail:()=>{/** 写入失败 */}, } ) } // 读取本地存的数据 let read=(key)=>{ return new Promise((resolve, reject) => { my.getStorage({ key: key, success: (res)=> { let _data=res.data || false; // res.data 不为null,undefined,空 if(_data){ let now=Date.now(); let _expired=_data.expired || false; // _data.expired 不为null,undefined,空 if(_expired && now < _data.expired){ resolve(_data.data); }else{ reject({code:33,message:'当前URL缓存数据已过期。'}); } }else{ reject({code:31,message:'本地数据已格式已损坏。'}); } }, fail: (res)=>{ //读取失败 reject({code:34,message:'当前URL无缓存数据。'}); } }); }) } // 获取 let caches= (obj)=>{ let {url,method='POST',data,headers,isSave=true}=obj; _request(obj) .then((res)=>{ _caches_url.set(url,true); }) .catch((error)=>{ _caches_url.set(url,false); }) return this; } // 生成指定长度的随机字符串 let _randomString=(length)=>{ let t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefhijklmnopqrstuvwxyz1234567890',n=t.length,s=''; for(var i=0;i<length;i++){ s+=t.charAt(Math.floor(Math.random()*n)); } return s; } // 对Obj的进行排序 let _sort2Arr = (data) => { let arr = [] for(let obj in data) { arr.push({key : obj, value : data[obj]? data[obj] : ""}) } arr.sort((o1, o2)=>{ //return o1.key.charCodeAt() - o2.key.charCodeAt(); return String(o1.key).localeCompare(String(o2.key)) }) return arr; } //对数组件进行拼序 let _arr2URL = (arr) => { let _str = ""; for (let idx in arr) { let interval = _str == "" ? "" : "&"; _str += `${interval}${arr[idx].key}=${arr[idx].value}` } return _str; } let _queryString=(data)=>{ return _arr2URL(_sort2Arr(data)); } let _arrToJSON = (arr) => { let json = {}; for (let idx in arr) { json[arr[idx].key] = arr[idx].value ; } return json; } // 发布请求, let _request = (obj) => { let {url,method='POST',data,headers,isSave=false,dataType='json',timeout=5000,task=null}=obj; var _returnPromise = new Promise((resolve, reject) => { // 如果task存在,则取消task的请求 if(_request_task.has(task) && task!=null){ let temp=_request_task.get(task); if(temp.abort){ temp.abort(); } } var _requestTask = my.request({ url: url, method: method, data: data, timeout: timeout, /* 车机性偏差,弱网处理时间可以放长至5秒 */ dataType: dataType, headers: headers, success: (result) => { try { if(result.status==307){ // console.warn('网络被重定向,请检侧网络问题!'); reject(errorInfo(307)) }else{ if(isSave){ // 是否写存储 let _key=url2key(obj); save(_key,result); } resolve(result); } } catch(e) { reject(errorInfo(0)) } }, fail: (err) => { //console.warn(err.status); let {error,status}=err; let code= status || error; //console.warn('网络返回格式错误,请检查headers是否正确!'); //console.warn(code); reject(errorInfo(code)) } }); if(task!=null){ _request_task.set(task,_requestTask); } //console.log(_request_task) }); return _returnPromise; } let abort=(task)=>{ if(task){ // 取消指定任务; let _tempReques=_request_task.get(task); if(_tempReques.abort){ _tempReques.abort(); } }else{ // 对所有请求任务都取消操作; _request_task.forEach((ele,v) => { if(ele.abort){ ele.abort(); } }); } } // 发起网络请求 let request = (obj) => { // 默认 enableCache 缓存不开启 // 定义任务 let {enableCache=false}=obj; let _key=url2key(obj); var _returnPromise= new Promise((resolve, reject) => { if(enableCache){ // 开启动本地缓存功能的情况下 read(_key) .then((res)=>{ resolve(res); // 返回本地存储数据 }) .catch((error)=>{ // 本地存诸读取失败的情况 obj.isSave=true; // 激活本次请求写入逻辑 _request(obj) .then((res)=>{ resolve(res); }) .catch((error)=>{ reject(error); }) }) // 正常返回本地存储数据 }else{ // 不启动本地缓存的情况下。 _request(obj) .then((res)=>{ resolve(res); }) .catch((error)=>{ reject(error); }) } }) return _returnPromise; }; export default {request:request,caches:caches,randomString:_randomString,sortToArray:_sort2Arr,arrayToUrl:_arr2URL,queryString:_queryString,arrayToJSON:_arrToJSON,abort:abort}