Javascript - 不传输的对象属性

时间:2011-03-23 17:36:10

标签: javascript ajax javascript-objects

我是Javascript的新手,并且不能为我的生活弄清楚为什么以下对象属性没有转移。

我按如下方式调用对象:

var URL = "TABLE=_Products&COLUMNS=price_Qty,Sale&MATCH=internal_Model&ROWS="+itemnum ;
var ITEM = new get_Database_Info(URL) ;

并且get_Database_Info为:

function get_Database_Info(PARAMS) {
    alert(toString(this));
    var URL = document.location.protocol+'//'+document.location.host+'/Catalog/Tools/ajax_Database_Request.php' ;

    if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
    else{// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }

    if(!xmlhttp){alert('Error: Cannot send XML request.');}
        xmlhttp.onreadystatechange=function() {

            if (xmlhttp.readyState==4 && xmlhttp.status==200){
                alert(toString(this));
                var RESPONSE = xmlhttp.responseText ;
                RESPONSE = RESPONSE.replace(/^\s+/, '');
                var ARR = RESPONSE.split('||') ;
                ARR.pop() ;
                for(var i=0; i<ARR.length; i++){
                    var temparr1 = ARR[i].split('=') ;
                    var NUM = temparr1[0] ;
                    this[NUM] = new Array() ;
                        var temparr2 =   temparr1[1].split('/|') ;
                        temparr2.shift() ;
                            for(var x=0; x<temparr2.length; x++){

                                var temparr3 = temparr2[x].split('??') ;

                                this[NUM][temparr3[0]] = temparr3[1] ;

                            }
                }

            }
        }

    xmlhttp.open("POST", URL, true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.setRequestHeader("Content-length", PARAMS.length);
    xmlhttp.setRequestHeader("Connection", "close");
    xmlhttp.send(PARAMS);

}

我已经验证所有属性都在get_Database_Info范围内的'this'中,但它们没有传回给ITEM。

2 个答案:

答案 0 :(得分:0)

我冒昧地猜测,附加到onreadystatechange的函数运行时this不再附加到构造函数中创建的对象,但可能附加到全局对象或{ {1}}对象。我会尝试使用xmlhttp模式:

var that=this

另外,如注释中所述,当您在function get_Database_Info(PARAMS) { alert(toString(this)); var URL = document.location.protocol+'//'+document.location.host+'/Catalog/Tools/ajax_Database_Request.php' ; if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else{// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } var that=this; // value of that will be stored in the closure if(!xmlhttp){alert('Error: Cannot send XML request.');} xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200){ alert(toString(that)); var RESPONSE = xmlhttp.responseText ; RESPONSE = RESPONSE.replace(/^\s+/, ''); var ARR = RESPONSE.split('||') ; ARR.pop(); var arrLength = ARR.length; // always precompute array length for(var i=0; i<ARR.length; i++){ var temparr1 = ARR[i].split('=') ; var NUM = temparr1[0] ; // that is actually equal to the object that I created // in the constructor. that[NUM] = new Array() ; var temparr2 = temparr1[1].split('/|') ; temparr2.shift() ; var arrayLength = temparr2.length; // always precompute length for(var x=0; x<arrayLength; x++){ var temparr3 = temparr2[x].split('??') ; that[NUM][temparr3[0]] = temparr3[1] ; } } } } xmlhttp.open("POST", URL, true); xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xmlhttp.setRequestHeader("Content-length", PARAMS.length); xmlhttp.setRequestHeader("Connection", "close"); xmlhttp.send(PARAMS); 循环的数组中迭代值时,不应直接使用array.length,因为将调用for方法每次通过循环,添加大量不必要的工作。

另外,正如@Guffa所说,添加值的函数是异步调用的,因此在XmlHttpRequest完成之前,属性将不存在,这是一种非常危险的反模式。我强烈建议不要这样做。让构造函数对数据进行同步请求会更好。

答案 1 :(得分:0)

您何时检查对象的内容?请求是异步的,因此在对象中有任何属性之前,您必须等到回调处理了响应。

如果在创建对象后立即查找属性,它们将永远不会存在。即使响应非常快,第一次回调可以运行的时候是退出创建对象的函数,因此浏览器会恢复控制。