在javascript函数中更改数组元素的值

时间:2010-11-27 23:35:03

标签: php javascript html ajax

这是我在javascript中使用的三个函数:

function postRequest()
{

    var xmlHttp;
    if(window.XMLHttpRequest)
    { // For Mozilla, Safari, ...
        var xmlHttp = new XMLHttpRequest();
    }
    else if(window.ActiveXObject)
    { // For Internet Explorer
        var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlHttp.open('GET', 'effort.php', true);
    xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlHttp.onreadystatechange = function()
    {
        if (xmlHttp.readyState == 4)
        {       
            get_string(xmlHttp.responseText);
            dij();
        }
    }
    xmlHttp.send(null);
}


function get_string(str)
{
    get_integer = str.split(" ");
    for(var i=0;i<214;i++)
    {
        vertex_i[j] = get_integer[i]*1;
        j++;
    }

    j=0;
    for(var i=214;i<427;i++)
    {
        vertex_f[j] = get_integer[i]*1;
        j++;
    }
    j=0;;
    for(var i=427;i<517;i++)
    {
        x[j] = get_integer[i]*1;
        j++;
    }
    j=0;
    for(var i=517;i<607;i++)
    {
        y[j] = get_integer[i]*1;
        j++;
    }


    for(var m=0;m<90;m++)
    {
        for(var n=0;n<90;n++)
        {   
            L[m][n] = -1;           
        }
    }
    for(var m=0;m<212;m++)
    {
        x1 = x[vertex_i[m]];
        x2 = x[vertex_f[m]];

        y1 = y[vertex_i[m]];
        y2 = y[vertex_f[m]];
        L[vertex_i[m]][vertex_f[m]] = parseInt(find_dist(x1,x2,y1,y2)); 
    }

}


function point_it(event)
{
    postRequest();


}

即: point_it(event),然后是postRequest();,最后是dij();

在这些函数中,我使用三个全局定义数组中的数据,其元素派生自服务器发送的数据(get_string函数)。

如果我从dij()函数中调用postRequest()函数(在get_string函数之后我能够访问数组中的正确数据。

但是如果我在postRequest()函数之后立即调用它,则数组中元素的值将变为null。 我无法理解这个的正当理由,并尝试了几种方法来通过但没有进展。 CAn sm1请帮帮我!

3 个答案:

答案 0 :(得分:0)

postRequest向服务器发出异步请求。在它之后直接调用函数并不意味着请求已经完成,并且您已经对响应数据做了任何事情。它在postRequest内部工作,因为您实际处理请求和响应的位置。

如果您想从内到外完成所有这一点,我建议您执行以下操作:

function postRequest(callback)
{
    var callbackFunc = callback||null;

    var xmlHttp;
    if(window.XMLHttpRequest)
    { // For Mozilla, Safari, ...
        var xmlHttp = new XMLHttpRequest();
    }
    else if(window.ActiveXObject)
    { // For Internet Explorer
        var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlHttp.open('GET', 'effort.php', true);
    xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlHttp.onreadystatechange = function()
    {
        if (xmlHttp.readyState == 4)
        {       
            get_string(xmlHttp.responseText);

            if(callbackFunc){
               callbackFunc();
            }
        }
    }
    xmlHttp.send(null);
}

function point_it(event)
{
    postRequest(dij);
}

这允许您改变使用由post请求填充的数组的回调,以及在请求周期完成后它总是触发的回调。

答案 1 :(得分:0)

XMLHttpRequest 异步

这意味着,只要请求发送,它就会立即返回。如果您现在致电dij(),请求仍然会待处理,并且尚未调用get_string

请求完成后,将立即调用回调,然后执行get_string

您还需要将dij()留在回调中。

目视:

  • postRequest已设置,设置回调,但执行回复,postRequest然后返回
  • 调用postRequest后执行的代码
  • 一段时间过去了......
  • XMLHttpRequest最终完成并执行回调,现在调用get_string

答案 2 :(得分:0)

全局变量不是一个好习惯。最好将get_string和dij函数合并为一个,将数组作为单个函数内的局部变量。