首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript -不传输对象属性

Javascript -不传输对象属性
EN

Stack Overflow用户
提问于 2011-03-24 01:36:10
回答 2查看 115关注 0票数 0

我是Javascript的新手,一生都不能弄清楚为什么以下对象属性不能传输。

我按如下方式调用该对象:

代码语言:javascript
运行
复制
var URL = "TABLE=_Products&COLUMNS=price_Qty,Sale&MATCH=internal_Model&ROWS="+itemnum ;
var ITEM = new get_Database_Info(URL) ;

get_Database_Info是:

代码语言:javascript
运行
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-24 01:48:37

什么时候检查对象的内容?该请求是异步的,因此您必须等到回调处理完响应后,对象中才会有任何属性。

如果您在创建对象后立即查找属性,它们将永远不会存在。即使响应真的很快,回调可以在您退出创建对象的函数时第一次运行,这样浏览器就可以重新获得控制。

票数 0
EN

Stack Overflow用户

发布于 2011-03-24 01:41:06

我大胆地猜测,当附加到onreadystatechange的函数运行时,this不再附加到正在构造函数中创建的对象,而可能附加到全局对象或xmlhttp对象。我会尝试使用var that=this模式:

代码语言:javascript
运行
复制
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);

此外,正如注释中所指出的,当您迭代for循环的数组中的值时,不应该直接使用array.length,因为每次循环中都会调用length方法,这会添加大量不必要的工作。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5409329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档