jcfw-lite/jcfw/common/httpcli.js
2020-02-07 12:35:00 +08:00

451 lines
16 KiB
JavaScript

class HttpCli {
constructor() {
this.cachemsg = [];
this._needretry = false;
this._retrycount = 3;
this._retryms = 3000;
this._runningcount = 0;
this._maxrunning = 10;
}
httpGet(url, cbRes, cbErr){
return this.httpsend(url, null, cbRes, cbErr, 'GET');
}
httpPost(url, postdata, cbRes, cbErr){
return this.httpsend(url, postdata, cbRes, cbErr, 'POST');
}
httpsend(url, urldata, cbRes, cbErr, smethod, isretry, contentType){
if(this._runningcount < this._maxrunning){
return this._httpsend(url, urldata, cbRes, cbErr, smethod, isretry, contentType);
}else{
console.log("[http]running/max:"+this._runningcount+"/"+this._maxrunning);
console.log("[http]url:"+url);
if(!isretry){
let obj = {
u: url,
v: urldata,
successcb: cbRes,
errcb: cbErr
};
this.cachemsg.push(obj);
return null;
}
}
}
_httpsend(url, urldata, cbRes, cbErr, smethod, isretry, contentType){
if(typeof(wx) != 'undefined' && wx.request){
return this._wxRequest(url, urldata, cbRes, cbErr, smethod, isretry, contentType);
}else if(typeof(XMLHttpRequest) != 'undefined'){
return this._webRequest(url,urldata, cbRes, cbErr, smethod, isretry, contentType);
}
return null;
}
_wxRequest(url, urldata, cbRes, cbErr, smethod, isretry, contentType){
this._runningcount++;
let self = this;
var jsobj = urldata? JSON.parse(urldata): null;
var ct = contentType || 'application/json';
var xhr = wx.request({
url: url,
data: jsobj,
method: smethod,
header: {
'content-type': ct,
'Cache-Control':'no-cache'
},
success: function(res){
console.log("[wx]request success!" + res.statusCode);
if(res.statusCode >= 200 && res.statusCode < 400) {
var restext = JSON.stringify(res.data);
cbRes && cbRes(restext);
}else{
if(!isretry && self._needretry){
let obj = {
u: url,
v: urldata,
successcb: cbRes,
errcb: cbErr
};
self.cachemsg.push(obj);
}else{
cbErr && cbErr(res.statusCode, res.msg);
}
}
},
fail: function(res){
console.log("[wx]request fail!"+ JSON.stringify(res));
if(!isretry && self._needretry){
let obj = {
u: url,
v: urldata,
successcb: cbRes,
errcb: cbErr
};
self.cachemsg.push(obj);
}else{
cbErr && cbErr(-1, res.msg);
}
// cbErr && cbErr(-1, res.msg);
},
complete: function(){
self._runningcount--;
console.log("[wx]request complete!");
}
});
return xhr;
}
_webRequest(url, urldata, cbRes, cbErr, smethod, isretry, contentType){
this._runningcount++;
let self = this;
url += url.indexOf('?') >=0 ? '&__t=' + new Date().getTime() : '?__t=' + Date.now();
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4){
self._runningcount--;
if(xhr.status >= 200 && xhr.status < 400) {
var response = xhr.responseText;
cbRes && cbRes(response);
}else{
if(!isretry && self._needretry){
let obj = {
u: url,
v: urldata,
successcb: cbRes,
errcb: cbErr,
contentType: contentType
};
self.cachemsg.push(obj);
}else{
cbErr && cbErr(xhr.status, xhr.statusText);
}
}
}
};
// xhr.onabort = function(){
// self._runningcount--;
// };
xhr.onerror = function(){
console.log('xhr.onerror');
self._runningcount--;
};
xhr.open(smethod, url, true);
(contentType) && xhr.setRequestHeader('content-type', contentType);
xhr.send(urldata);
return xhr;
}
_retry(){
if(this.cachemsg.length > 0){
this.cachemsg.forEach(element => {
let obj = element;
if(obj.retrying){
return;
}
let bneedretry = false;
if(!obj.retry_count){
obj.retry_count = 1;
obj.passtime = 0;
}
obj.passtime += this._retryms;
bneedretry = (obj.passtime >= obj.retry_count * this._retryms);
if(bneedretry && !obj.retrying){
obj.retrying = true;
let method = obj.v? 'POST': 'GET';
this.httpsend(obj.u, obj.v, (restext) => {
obj.successcb && obj.successcb(restext);
let idx = this.cachemsg.findIndex((element) => {
return element == obj;
});
if(idx != -1){
this.cachemsg.splice(idx, 1);
}
}, (errcode, errmsg) => {
obj.retrying = false;
obj.passtime = 0;
obj.retry_count++;
if(obj.retry_count >= this._retrycount){
obj.errcb && obj.errcb(errcode, errmsg);
let idx = this.cachemsg.findIndex((element) => {
return element == obj;
});
if(idx != -1){
this.cachemsg.splice(idx, 1);
}
}
}, method, true, obj.contentType);
}
});
}
}
setRetryCount(count){
this.retrycount = count;
}
setRetryInterval(millsec){
if(millsec != this._retryms){
this._retryms = millsec;
if(this._retry_tid){
clearInterval(this._retry_tid);
this._retry_tid = 0;
}
}
if(!this._retry_tid){
this._retry_tid = setInterval(this._retry.bind(this), this._retryms);
}
}
setNeedRetry(needretry){
this._needretry = needretry;
// if(!this._needretry && this._retry_tid){
// clearInterval(this._retry_tid);
// this._retry_tid = 0;
// }else if(this._needretry && !this._retry_tid){
// this._retry_tid = setInterval(this._retry.bind(this), this._retryms);
// }
}
}
module.exports = HttpCli;
// var httpcli = cc.Class({
// // LIFE-CYCLE CALLBACKS:
//
// // onLoad () {},
//
// // start () {},
//
// // update (dt) {},
//
// __ctor__(){
// this.cachemsg = [];
// this._needretry = false;
// this._retrycount = 3;
// this._retryms = 3000;
// this._runningcount = 0;
// this._maxrunning = 10;
// // this._retry_tid = setInterval(this._retry.bind(this), this._retryms);
// },
//
// httpGet(url, cbRes, cbErr){
// // var realurl = url;
// // if(urldata){
// // if(realurl.indexOf("?") == -1){
// // realurl += "?";
// // }else{
// // realurl += "&";
// // }
// // realurl += encodeURIComponent(urldata);
// // }
// return this.httpsend(url, null, cbRes, cbErr, 'GET');
// },
//
// httpPost(url, postdata, cbRes, cbErr){
// return this.httpsend(url, postdata, cbRes, cbErr, 'POST');
// },
//
// httpsend(url, urldata, cbRes, cbErr, smethod, isretry, contentType){
// if(this._runningcount < this._maxrunning){
// return this._httpsend(url, urldata, cbRes, cbErr, smethod, isretry, contentType);
// }else{
// console.log("[http]running/max:"+this._runningcount+"/"+this._maxrunning);
// console.log("[http]url:"+url);
// if(!isretry){
// let obj = {
// u: url,
// v: urldata,
// successcb: cbRes,
// errcb: cbErr
// };
// this.cachemsg.push(obj);
// return null;
// }
// }
// },
//
// _httpsend(url, urldata, cbRes, cbErr, smethod, isretry, contentType){
// if(typeof(wx) != 'undefined' && wx.request){
// return this._wxRequest(url, urldata, cbRes, cbErr, smethod, isretry, contentType);
// }else if(typeof(XMLHttpRequest) != 'undefined'){
// return this._webRequest(url,urldata, cbRes, cbErr, smethod, isretry, contentType);
// }
// return null;
// },
//
// _wxRequest(url, urldata, cbRes, cbErr, smethod, isretry, contentType){
// this._runningcount++;
// let self = this;
// var jsobj = urldata? JSON.parse(urldata): null;
// var ct = contentType || 'application/json';
// var xhr = wx.request({
// url: url,
// data: jsobj,
// method: smethod,
// header: {
// 'content-type': ct,
// 'Cache-Control':'no-cache'
// },
// success: function(res){
// console.log("[wx]request success!" + res.statusCode);
// if(res.statusCode >= 200 && res.statusCode < 400) {
// var restext = JSON.stringify(res.data);
// cbRes && cbRes(restext);
// }else{
// if(!isretry && self._needretry){
// let obj = {
// u: url,
// v: urldata,
// successcb: cbRes,
// errcb: cbErr
// };
// self.cachemsg.push(obj);
// }else{
// cbErr && cbErr(res.statusCode, res.msg);
// }
// }
// },
// fail: function(res){
// console.log("[wx]request fail!"+ JSON.stringify(res));
// if(!isretry && self._needretry){
// let obj = {
// u: url,
// v: urldata,
// successcb: cbRes,
// errcb: cbErr
// };
// self.cachemsg.push(obj);
// }else{
// cbErr && cbErr(-1, res.msg);
// }
// // cbErr && cbErr(-1, res.msg);
// },
// complete: function(){
// self._runningcount--;
// console.log("[wx]request complete!");
// }
// });
// return xhr;
// },
//
// _webRequest(url, urldata, cbRes, cbErr, smethod, isretry, contentType){
// this._runningcount++;
// let self = this;
// url += url.indexOf('?') >=0 ? '&__t=' + new Date().getTime() : '?__t=' + Date.now();
// var xhr = new XMLHttpRequest();
// xhr.onreadystatechange = function () {
// if (xhr.readyState == 4){
// self._runningcount--;
// if(xhr.status >= 200 && xhr.status < 400) {
// var response = xhr.responseText;
// cbRes && cbRes(response);
// }else{
// if(!isretry && self._needretry){
// let obj = {
// u: url,
// v: urldata,
// successcb: cbRes,
// errcb: cbErr,
// contentType: contentType
// };
// self.cachemsg.push(obj);
// }else{
// cbErr && cbErr(xhr.status, xhr.statusText);
// }
// }
// }
// };
// // xhr.onabort = function(){
// // self._runningcount--;
// // };
// xhr.onerror = function(){
// console.log('xhr.onerror');
// self._runningcount--;
// };
// xhr.open(smethod, url, true);
// (contentType) && xhr.setRequestHeader('content-type', contentType);
// xhr.send(urldata);
// return xhr;
// },
//
// _retry(){
// if(this.cachemsg.length > 0){
// this.cachemsg.forEach(element => {
// let obj = element;
// if(obj.retrying){
// return;
// }
// let bneedretry = false;
// if(!obj.retry_count){
// obj.retry_count = 1;
// obj.passtime = 0;
// }
// obj.passtime += this._retryms;
// bneedretry = (obj.passtime >= obj.retry_count * this._retryms);
//
// if(bneedretry && !obj.retrying){
// obj.retrying = true;
// let method = obj.v? 'POST': 'GET';
// this.httpsend(obj.u, obj.v, (restext) => {
// obj.successcb && obj.successcb(restext);
// let idx = this.cachemsg.findIndex((element) => {
// return element == obj;
// });
// if(idx != -1){
// this.cachemsg.splice(idx, 1);
// }
// }, (errcode, errmsg) => {
// obj.retrying = false;
// obj.passtime = 0;
// obj.retry_count++;
// if(obj.retry_count >= this._retrycount){
// obj.errcb && obj.errcb(errcode, errmsg);
// let idx = this.cachemsg.findIndex((element) => {
// return element == obj;
// });
// if(idx != -1){
// this.cachemsg.splice(idx, 1);
// }
// }
// }, method, true, obj.contentType);
// }
//
// });
// }
// },
//
// setRetryCount(count){
// this.retrycount = count;
// },
//
// setRetryInterval(millsec){
// if(millsec != this._retryms){
// this._retryms = millsec;
// if(this._retry_tid){
// clearInterval(this._retry_tid);
// this._retry_tid = 0;
// }
// }
// if(!this._retry_tid){
// this._retry_tid = setInterval(this._retry.bind(this), this._retryms);
// }
// },
//
// setNeedRetry(needretry){
// this._needretry = needretry;
// // if(!this._needretry && this._retry_tid){
// // clearInterval(this._retry_tid);
// // this._retry_tid = 0;
// // }else if(this._needretry && !this._retry_tid){
// // this._retry_tid = setInterval(this._retry.bind(this), this._retryms);
// // }
// }
// });
//
// module.exports = httpcli;