Глобальная переменная область Jquery / неправильные значения [дубликаты]

0

У меня проблема с конечными значениями, присвоенными глобальным переменным (success, count_error, error) в моем коде ниже. Перед разделением вывода, если я не включаю "предупреждение (успех)"; все значения равны нулю. Однако, если я включаю эту строку, выводятся правильные значения. Почему это, что-то не так с переменной областью?

<html>
<head>

<script src="../jquery-1.11.0.js"></script>
<script>
var rows_all = [1,2,3,4,5,6,7,8,9,10],
    success = 0,
    count_error = 0,
    error = [];

/////////////////////////////////////////////////////////////////////////
// In test_addresses create lat/lon [number] from coordinates [string] //
/////////////////////////////////////////////////////////////////////////
$.getJSON("http://******.cartodb.com/api/v2/sql?q=" + "SELECT cartodb_id FROM test_addresses" + "&api_key=******", function(data) {

//get #rows for loop function
//$.each(data.rows, function(key, val) {
    //rows_all.push(val['cartodb_id']);
//});


//loop through rows (get coordinates), manipulate + post values
$.each(rows_all, function(key1, val1) {
    $.getJSON("http://******.cartodb.com/api/v2/sql?q=" + "SELECT address, coordinates FROM test_addresses WHERE cartodb_id=" + val1 + "&api_key=******", function(data1) {
        $.each(data1.rows, function(key2, val2) {
            address = val2['address'];
            lat_lon = val2['coordinates'];
            if (lat_lon.indexOf('?') === -1) {
                lat = parseFloat( lat_lon.split(',')[0] );
                lon = parseFloat( lat_lon.split(',')[1] );
                $.post("http://******.cartodb.com/api/v2/sql?q=" + "UPDATE test_addresses SET lat=" + lat + ", lon=" + lon + "WHERE cartodb_id=" + val1 + "&api_key=******");
                success++; //number of successfully completed operations
            }
            else {
                count_error++; //#error operations
                list = {};
                list["id"] = val1; //@which cartodb_id in table
                list["address"] = address; //@which matching address in table
                error.push(list); 
            }
        });
    });
});

alert( success );
//Ouput text    
$("#result").html(success + " entries successfully geocoded. </br><br>There were " + count_error + " errors. <br>More pecifically at cartodb_id : address:");   
$.each(error, function(key4, val4) {
    $("#result").append("<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + val4["id"] + " : " + val4["address"]);
});

$.each(rows_all, function(key5, val5) {
    $("#result").append("<br>" + key5);
});
});

</script>
</head>

<body>
    <p id="result"></p>
</body>
</html>
Теги:
variables
global

1 ответ

0
Лучший ответ

Это асинхронный запрос, поэтому alert() загорается перед получением данных. Поэтому вы должны изменить код, как,

$.getJSON("http://******.cartodb.com/api/v2/sql?q=" + "SELECT cartodb_id FROM test_addresses" + "&api_key=******", function (data) {

//get #rows for loop function
//$.each(data.rows, function(key, val) {
//rows_all.push(val['cartodb_id']);
//});


//loop through rows (get coordinates), manipulate + post values
$.each(rows_all, function (key1, val1) {
    $.getJSON("http://******.cartodb.com/api/v2/sql?q=" + "SELECT address, coordinates FROM test_addresses WHERE cartodb_id=" + val1 + "&api_key=******", function (data1) {
        $.each(data1.rows, function (key2, val2) {
            address = val2['address'];
            lat_lon = val2['coordinates'];
            if (lat_lon.indexOf('?') === -1) {
                lat = parseFloat(lat_lon.split(',')[0]);
                lon = parseFloat(lat_lon.split(',')[1]);
                $.post("http://******.cartodb.com/api/v2/sql?q=" + "UPDATE test_addresses SET lat=" + lat + ", lon=" + lon + "WHERE cartodb_id=" + val1 + "&api_key=******");
                success++; //number of successfully completed operations
                alert(success);

            } else {
                count_error++; //#error operations
                list = {};
                list["id"] = val1; //@which cartodb_id in table
                list["address"] = address; //@which matching address in table
                error.push(list);
            }
        });
        //Ouput text    
        $("#result").html(success + " entries successfully geocoded. </br><br>There were " + count_error + " errors. <br>More pecifically at cartodb_id : address:");
        $.each(error, function (key4, val4) {
            $("#result").append("<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + val4["id"] + " : " + val4["address"]);
        });

        $.each(rows_all, function (key5, val5) {
            $("#result").append("<br>" + key5);
        });
    });
});



});

Вы должны поместить код внутри области $.getJSON. Таким образом, он будет работать только после получения данных.

На самом деле его не предупреждает() делает магию. Если вы ставите предупреждение, событие успеха будет происходить с меньшим интервалом времени, прежде чем пользователь нажмет кнопку ok. За это время все значения будут заполнены.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню