分享

创建xmlhttp请求&管理请求

 跃来跃去 2009-12-15
var Bind = function(object, fun) {
    var args = Array.prototype.slice.call(arguments).slice(2);
    return function() {
          return fun.apply(object, args.concat(Array.prototype.slice.call(arguments)));
     }
}

var Request = function() {
    this.requestexe = this.getNewRequest();
    this.action = 'get';
    this.url = '';
    this.ondone = null;
    this.onerror = null;
    this.headers = null;
    this.body = null;
    this.isstart = false;
    this.timer = null;
    this.paras = null;
}
Request.prototype = {
    count : 0,
    getNewRequest : function(){
        try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
        try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
        try { return new XMLHttpRequest(); } catch(e) {}
        alert("XMLHttpRequest not supported");
        return null;
    },
    send : function(){
        if(this.isstart) return;
        if(this.getCount() > 1){
            setTimeout(Bind(this, this.send),500);
            return;
        }
        this.waitOne();
        this.isstart = true;
        this.url = this.url +  "&" + new Date().getTime().toString();
        this.requestexe.open(this.action,this.url,true);
        if(this.headers){
            for (var header in this.headers) {
                var val = headers[header];
                if (typeof(val) !== "function")
                    this.requestexe.setRequestHeader(header, val);
            }
        }
        if (this.action.toLowerCase() === "post") {
            if ((this.headers === null) || !headers['Content-Type']) {
                this.requestexe.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            }
                if (!this.body) {
                this.body = "";
            }
        }
        var request = this;
        var httpexe = this.requestexe;
        this.requestexe.onreadystatechange = function(){
            if(httpexe.readyState == 4){
                clearTimeout(request.timer);
                Bind(request,request.releaseOne());
                if(httpexe.status == 200){
                    if(typeof(request.ondone) === "function"){
                        request.ondone(httpexe,request.paras);
                    }
                }
                else{
                    if(typeof(request.onerror) === "function"){
                        request.onerror(httpexe,request.paras);
                    }
                }
            }
        }
        this.timer = setTimeout( function(){
            request.requestexe.abort();
            clearTimeout(request.timer);
            request.releaseOne();
        },20000);
        this.requestexe.send(this.body);
    },
    releaseOne: function(){
        if(Request.prototype.count >= 0)
        Request.prototype.count--;
    },
    waitOne:function(){
        Request.prototype.count++;
    },
    getCount:function(){
        return Request.prototype.count;
    }
}

在使用时如下:
    var request = new Request();
    request.action = 'get';
    request.url = 'requesturl';
    request.ondone = function(result,paras){
        var p = result.responseText;
    };
    request.onerror = function(result,paras){
        alert(result.status);
    };
    request.paras = '';
    request.send();       

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多