Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.07.2018, 12:00
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

Цикл 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  будет много и это не вариант.  
Получается во время выполнения цикла функция просто не успевает отработать данные? Или я криворукий и так не делается?
Ответить с цитированием
  #2 (permalink)  
Старый 18.07.2018, 12:09
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 498

А "//что то там делаю" - это что именно? Данные эти на страницу попадают только после завершения цикла:
$("#table").html(html);
Ответить с цитированием
  #3 (permalink)  
Старый 18.07.2018, 12:37
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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

Нельзя так?
see_table (data[i]);
Ответить с цитированием
  #4 (permalink)  
Старый 18.07.2018, 12:59
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

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 секунды не успевает это обработать?

Последний раз редактировалось Artur_Hopf, 18.07.2018 в 13:07.
Ответить с цитированием
  #5 (permalink)  
Старый 18.07.2018, 13:01
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Artur_Hopf,
сразу предупреждаю - лучше не будет. Спросил из любопытства
Ответить с цитированием
  #6 (permalink)  
Старый 18.07.2018, 13:16
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заставить mouseenter приостанавливать цикл Andreeshe Общие вопросы Javascript 5 02.10.2017 17:21
Цикл завершается не дожидаясь выполнения функции leonoff jQuery 2 13.08.2014 16:02
Как подчинить себе цикл wreder jQuery 17 20.11.2013 22:17
Цикл завешивает страницу, помогите Romingood jQuery 5 19.10.2013 14:30
как сделать чтобы цикл не запускался второй раз Brook Events/DOM/Window 5 12.05.2013 21:43