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;