почему значение глобальной переменной не устанавливается? - PullRequest
0 голосов
/ 25 февраля 2011

Не могу понять, почему моя глобальная переменная workRegionCode установлена ​​неправильно.

В функции getWorkRegion() после получения обратного вызова ajax она пытается установить глобальную переменную workRegionCode. (внутри функции setFirstIndexWorkRegionCode()).

Предупреждение в setFirstIndexWorkRegionCode() выводит ожидаемое значение, например 401 или 123 и т. Д.

Но тогда, когда вызывается getMachines(), глобальная переменная workRegionCode является неопределенной: (* ​​1016 *

Это js начинается с window.onload ()

(пожалуйста, не обращайте внимания на значение японского ключа JSON и несколько японских переменных. Они безвредны)

Код:

    var workRegionDropdown = document.getElementById("workRegionDropdown");;
    var machineDropdown = document.getElementById("machineDropdown");

    //this is the global variable with problem.....
    var workRegionCode;

    //INIT
    window.onload = function() {

        getWorkRegions();

       // alert("before: " + window.workRegionCode);

        getMachines();

      //  alert("after: " + window.workRegionCode);
    }

    function addWorkRegionToDropdown(jsonObject, dropdown) {
        for(var i=0, j=jsonObject.length; i<j; i++) {
            var option = document.createElement("option");
            option.text = jsonObject[i].作業区コード + ":" + jsonObject[i].作業区名漢字;
            option.value = jsonObject[i].作業区コード;
            dropdown.options.add(option);
        }
    }

    function addMachineToDropdown(jsonObject, dropdown) {
        for(var i=0, j=jsonObject.length; i<j; i++) {
            var option = document.createElement("option");
            option.text = jsonObject[i].機械名;
            option.value = jsonObject[i].機械名;
            dropdown.options.add(option);
        }
    }


    function getMachines() {

        //!!!!!!!!!!! workRegionCode is undefined.. why?!?!?!  

        alert("inside of getMachines() ==> " + window.workRegionCode);

        var ajaxRequest = new XMLHttpRequest();
        ajaxTimeout = setTimeout(function() {timeoutAjax(ajaxRequest, "showMessage")}, "5000");

        ajaxRequest.onreadystatechange = function() {
            if(ajaxRequest.readyState == 4  ) {
                clearTimeout(ajaxTimeout);
                switch ( ajaxRequest.status ) {
                    case  200:
                                var jsonOut = JSON.parse(ajaxRequest.responseText);
                                addMachineToDropdown(jsonOut.機械, machineDropdown);
                                break;
                    default:

                                document.getElementById("showMessage").innerHTML = ajaxRequest.responseText;
                }
            }
        }


        var aMonthAgo = new Date();
        with(aMonthAgo) {
            setMonth(getMonth() - 1)
        }
        aMonthAgo = aMonthAgo.getYYYYMMDD();
        var 終了日 = "29991231";

        var url = "../resources/machine/list/" + window.workRegionCode + "/" + aMonthAgo + "/" + 終了日;
        ajaxRequest.open("GET", url, true);
        ajaxRequest.send(null)
    }




    function getWorkRegions() {
        var ajaxRequest = new XMLHttpRequest();
        ajaxTimeout = setTimeout(function() {timeoutAjax(ajaxRequest, "showMessage")}, "5000");

        ajaxRequest.onreadystatechange = function() {
            if(ajaxRequest.readyState == 4  ) {
                clearTimeout(ajaxTimeout);
                switch ( ajaxRequest.status ) {
                    case  200:
                                var jsonOut = JSON.parse(ajaxRequest.responseText);

                                //set global variable workRegionCode
                                setFirstIndexWorkRegionCode(jsonOut);

                                addWorkRegionToDropdown(jsonOut.作業区, workRegionDropdown);
                    default:

                                document.getElementById("showMessage").innerHTML = ajaxRequest.responseText;
                }
            }
        }

        var url = "../resources/workshop/list";
        ajaxRequest.open("GET", url, true);
        ajaxRequest.send(null)
    }//end getWorkRegions()

    function setFirstIndexWorkRegionCode(jsonString) {

        //here I set the value to work region code!
        window.workRegionCode = jsonString.作業区[0].作業区コード;
        alert("作業区コード: " + window.workRegionCode);

     }

Ответы [ 2 ]

2 голосов
/ 25 февраля 2011

«A» в AJAX обозначает асинхронный. Это означает, что вызов AJAX сработал, а остальная часть кода продолжает выполняться. Это не ждет ответа. Это был бы синхронный звонок. Если getMachines () зависит от ответа на getWorkRegions (), вы должны сделать что-то вроде этого:

window.onload = function() {

    getWorkRegions();

}


getWorkRegions() {

...
    if (ajaxRequest.status == 200) {

        ...
        var jsonOut = JSON.parse(ajaxRequest.responseText);
        setFirstIndexWorkRegionCode();
        addWorkRegionToDropdown();

        getMachines();
        ...
    }

...

}
1 голос
/ 25 февраля 2011

Значение для workRegionCode назначается в функции обратного вызова асинхронного запроса AJAX, но вы пытаетесь прочитать значение в потоке, который создал запрос AJAX. getMachines() будет всегда выполняться до вашей функции ajaxRequest.onreadystatechange, которая запускает настройку workRegionCode.

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