изменение значений элементов массива в функциях JavaScript - PullRequest
0 голосов
/ 28 ноября 2010

Это мои три функции, которые я использую в 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(), значение элементов в массиве становится равным нулю. Я не могу понять правильныепричина для этого и пробовал несколько способов пройти, но без прогресса. CAn sm1, пожалуйста, помогите мне!

Ответы [ 3 ]

0 голосов
/ 28 ноября 2010

XMLHttpRequest - асинхронный .

Это означает, что он вернется, как только запрос будет отправить .Если вы сейчас позвоните dij(), запрос все еще будет в ожидании , а get_string еще не был вызван.

Как только запросы завершатся, обратный вызов будет вызван, а затем выполнить get_string.

Вам нужно также оставить dij() внутри обратного вызова.

Визуально:

  • postRequest ismade, устанавливает обратный вызов, но не выполняет его, postRequest затем возвращает
  • код после вызова postRequest, который выполняет
  • через некоторое время..
  • XMLHttpRequest наконец завершается и выполняется обратный вызов, который теперь вызывает get_string
0 голосов
/ 28 ноября 2010

Глобальные переменные не являются хорошей практикой. Лучше объединить ваши функции get_string и dij в одну с вашими массивами в качестве локальных переменных внутри одной функции.

0 голосов
/ 28 ноября 2010

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);
}

это позволяет вам изменять обратный вызов, который использует массив, заполненный постом.запрос и в гостях, что он всегда запускает после , что цикл запроса завершен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...