Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Цикл for не успевает? (https://javascript.ru/forum/misc/74524-cikl-ne-uspevaet.html)

Artur_Hopf 18.07.2018 12:00

Цикл for не успевает?
 
Добрый день. Есть код который получает объект из sql базы и заносит его в таблицу:
function get_data() {
$.ajax({
        type: 'ajax',
        url: 'get_data',
        dataType: 'json',
        success: function (data) {
                for (i = 0; i < data.length; i++){
                    html += '<tr>' +
                    '<td class="success">' + data[i].RO + '</td>' +
                    // перечень параметров
                    '</tr>';                 
                }
                $("#table").html(html);
        }
});
}
setInterval(function(){
        get_data ();
}, 2000);


Так вот, далее допустим я отслеживаю состояние параметров объектов и что то хочу с ним сделать в таблице, пишу функцию
function see_table (atribut, data){
        if(data[atribut] == 'меня не устраивает'){
                //что то там делаю
        }
}


И такой думаю, параметров много, засуну ка я их в мой цикл:
function get_data() {
$.ajax({
        type: 'ajax',
        url: 'get_data',
        dataType: 'json',
        success: function (data) {
                for (i = 0; i < data.length; i++){
                    html += '<tr>' +
                    '<td class="success">' + data[i].RO + '</td>' +
                    // перечень параметров
                    '</tr>'; 
                   see_table (i, data);                
                }
                $("#table").html(html);
        }
});


Но когда я так делаю функция не выполняет то что должна, данные передаются нормально в нее.
А вот если сделать так, то функция see_table прекрасно отрабатывает:

function get_data() {
$.ajax({
        type: 'ajax',
        url: 'get_data',
        dataType: 'json',
        success: function (data) {
                for (i = 0; i < data.length; i++){
                    html += '<tr>' +
                    '<td class="success">' + data[i].RO + '</td>' +
                    // перечень параметров
                    '</tr>';               
                }
                $("#table").html(html);

                 see_table (0, data);
                 see_table (1, data);
                 see_table (2, data);
                 see_table (3, data);
                
        }
});

То есть передаю вручную вне цикла, но объектов внутри data  будет много и это не вариант.  
Получается во время выполнения цикла функция просто не успевает отработать данные? Или я криворукий и так не делается?

Белый шум 18.07.2018 12:09

А "//что то там делаю" - это что именно? Данные эти на страницу попадают только после завершения цикла:
$("#table").html(html);

Dilettante_Pro 18.07.2018 12:37

Artur_Hopf,
Мучает меня любопытство:
Зачем вы передаете в функцию весь массив?
see_table (i, data);

Нельзя так?
see_table (data[i]);

Artur_Hopf 18.07.2018 12:59

Dilettante_Pro,
Мм, точно, сейчас попробую..
Не помогло =)
В этой функции я сравниваю даты, текущую и полученную из таблицы, если они отличаются больше чем на час меняю класс объекта в таблице:
function see_table (atr, data){

    var realTime = moment().format();
    var time = moment(dateTimeWT[atr].DateTime).add(1, 'hour').format();
    var isSame = moment(time).isSameOrBefore(realTime); // сравнение даты
    if(isSame){
        $('#fa_1'+atr).css({"color": "black", "opacity": "1"});
    };
    
    if(CWT[atr].odds_p < 0 || CWT[atr].status == 3 && data[atr].TechState){
        $('#odds_p'+atr).removeClass('success');
        $('#odds_p'+atr).addClass('danger');
    } else{
        $('#odds_p'+atr).removeClass('danger');
        $('#odds_p'+atr).addClass('success');
    };
    
    if(data[atr].TechState){
        $('#odds_p'+atr).removeClass('danger');
    };
}


Получается цикл за 2 секунды не успевает это обработать?

Dilettante_Pro 18.07.2018 13:01

Artur_Hopf,
сразу предупреждаю - лучше не будет. Спросил из любопытства

Artur_Hopf 18.07.2018 13:16

Dilettante_Pro,
Все до меня дошло, таблица не была создана до этой функции,вот и вся причина =)


Часовой пояс GMT +3, время: 22:18.