Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
133 / 118 / 34
Регистрация: 04.04.2018
Сообщений: 593

SetInterval and setTimeout

11.02.2019, 14:36. Показов 1925. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Имеется такой код.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
 
var time_end = "0" + "0" + "10" + "00"; // 10 минут до начала торгов
 
window.onload = time(); // вызов первого таймера, для уточнения сколько осталось до начала торгов
function time_two() {  // функция таймера для вывод времени сколько осталось до завершения торгов
     var timeend = new Date(<?php echo $end_date; ?>);  // дата и время завершения торгов
    today = new Date(); // текущая дата и время
    today = Math.floor((timeend-today)/1000); // считаем
     if(today < 0){ // если меньше нуля
        alert('Время вышло');  // выводим сообщение
     }
    else if(today > 0){ // более нуля
    // считаем время
            tsec=today%60; today=Math.floor(today/60); if(tsec<10)tsec='0'+tsec;
        tmin=today%60; today=Math.floor(today/60); if(tmin<10)tmin='0'+tmin;
        thour=today%24; today=Math.floor(today/24);
        // вывод в блок
         document.getElementById('t').innerHTML = "До конца торгов осталось "+today +" дней "+ thour+" часов "+tmin+" минут "+tsec+" секунд";
         document.getElementById('t').style='font-size:14px;color:#00e200;';
 
        var time_active = setInterval(time_two, 1000); // вызываем функцию time_two, то есть саму себя через секунду
    }
}
function check_time(){  
    var time_active = setTimeout(send_contract, 5000); // вызов функции для поднятия цены, шагов, уточнения статуса торгов
    // пробовал setInterval использовать, но эффект тот же самый что и сейчас
}
function time() { // функция для вывода сколько осталось до начала торгов
var timeend = new Date(<?php echo $start_date; ?>); // старт торгов из БД по данному лоту
     today = new Date(); // текущая дата и время
    today = Math.floor((timeend-today)/1000); // считаем
    if(today < 0){ // если уже время для торгов наступило(то есть меньше 0), тогда проверяем контракты и вызывает второй таймер
        send_contract(); 
        //document.getElementById('up').style = 'display:block';
            time_two();
            return;
     }
    else if(today > 0){
        tsec=today%60; today=Math.floor(today/60); if(tsec<10)tsec='0'+tsec;
        tmin=today%60; today=Math.floor(today/60); if(tmin<10)tmin='0'+tmin;
        thour=today%24; today=Math.floor(today/24);
            var sver = today +''+ thour +''+ tmin +''+ tsec;
        if(time_end < sver){
             timestr= "До начала торгов осталось "+today +" дней "+ thour+" часов "+tmin+" минут "+tsec+" секунд";
         document.getElementById('t').innerHTML=timestr;
             document.getElementById('t').style='font-size:14px;color:#f20000;'
             var timeinterval_start = setInterval(time, 1000);
      }
        else
            if(time_end > sver){
                timestr= "До торгов осталось "+today +" дней "+ thour+" часов "+tmin+" минут "+tsec+" секунд";
             document.getElementById('t').innerHTML=timestr;    
                 document.getElementById('t').style='font-size:14px;color:#004165;'
           // document.getElementById('view_cont').style = 'display:block;'
                 var timeinterval_start = setInterval(time, 1000);
            }
        }
}
 
function send_contract(){ // тут данные с помощью аjax'a запрашиваются, какая цена, статус, чтобы пользователям выводить каждые 5 секунд
     var contract_lot = "<?php echo $rs['id'];?>";
     var token = document.getElementById('token').value;
if(!!contract_lot && !!token){
    $.ajax({
        url: "./ajax/auction/zayavka.php",
        type: "POST",
        dataType: "json",
        data: {
            "contract_lot": contract_lot,
            "token":token
 
        },
        success: function(data){
             if(data.result == 'finish'){
                    document.getElementById('result_modal_lot').innerHTML =  "<center> Лот продан<br/> Цена лота составила <b>"+ data.price+"</b>    </center>";
                        $('#overlay_lot').fadeIn(400, 
                            function(){ 
                                $('#modal_form_lot') 
                                    .css('display', 'block') 
                                    .animate({opacity: 1, top: '50%'}, 200); 
                                });
                     document.getElementById('t').innerHTML= "<center> Лот продан<br/> Цена лота составила <b>"+ data.price+"</b>    </center>";
                     document.getElementById('view_cont').style = 'display:none;'
                     document.getElementById('up').style = 'display:none;'
                    return time_two();          
            }else if(data.result == "success"){
                
                    document.getElementById('price').innerHTML = data.price;
                    document.getElementById('st').innerHTML = data.step;
                  //check_none_up();
                  check_time(); // запуск таймера еще раз, чтобы сработал через 5 секунд.
                  return;
                         // document.getElementById('up').style = 'display:none;';
                      
                        // document.getElementById('zayav').style = 'display:none;';
                    
            }
            else if(data.result == "no_price"){
                     document.getElementById('t').innerHTML= "Акукцион не состоялся";    
                     document.getElementById('view_cont').style = 'display:none;'
                     document.getElementById('up').style = 'display:none;'
                     return;
 
          }
          else if(data.result == "bliz"){
                     document.getElementById('t').innerHTML= "Лот продан по Блиц-цене";  
                     document.getElementById('up').style = 'display:none;'
                     document.getElementById('view_cont').style = 'display:none;'
                     return;
 
         }
         else if(data.result == 'timecontin'){
                    document.getElementById('st').innerHTML = data.step;
                     document.getElementById('t').innerHTML= "Лот продан по времени"; 
                     document.getElementById('price').innerHTML = data.html;
                     document.getElementById('up').style = 'display:none;'
                     document.getElementById('view_cont').style = 'display:none;'
                     return;            
         }
         else if(data.result == "errors"){
                            alert(1);               
         }
         else if(data.result == "error"){
                            alert(2);               
         }
        },               
         error:  function(xhr, str){
                      alert('Возникла ошибка: ' + xhr.responseCode);
     }
    });
}       
                
                    
 
 
}
У меня проблема возникает именно с send_contract() я до этого пробовал setInterval но в документации, да и на практике как заметил, время отправки запроса затягивалось и затягивалось, поэтому сделал на setTimeout как сейчас в коде. Результат один, отправляет запрос на AJAX почему-то с каждой отправкой с большим интервалом времени. Прикладываю скрин времени. Подскажите, что делаю не так, в какую сторону смотреть?
Изображения
 
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.02.2019, 14:36
Ответы с готовыми решениями:

setTimeout и setInterval за и против
Подскажите По фукциональности они похжи, по написанию тоже )) Чем же лучше пользоваться, и почему ? Сам никак не могу определиться, а...

SetTimeout
Надо чтобы квадраты меняли цвет на зеленый, сначала один, потом другой и снова. Что тут может быть не так? &lt;!DOCTYPE html&gt; ...

SetTimeout
... хотя может быть проблема в чём-то другом (руки неоттуда растут?), но я всёже грешу на этот гадский таймер. Короче, я пытаюсь сделать,...

9
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
11.02.2019, 15:16
setInterval (функция, 5000) запускает функцию через каждые 5 секунд, совершенно не обращая внимание на то, выполнено ли то, что прописано в функции, или нет -- это как каждые 5 минут звонить в скорую, не дожидаясь ответа оператора (или прерывая начавшийся разговор с оператором, потому как 5 минут прошло, и надо снова 03 набирать)... сомневаюсь, что скорую в этом случае вы вызвать сможете

аякс -- это асинхронный запрос, время ответа сервера никак вами не контролируется, здесь в любом случае надо использовать setTimeout (), запуская его только после получения ответа сервера
а у вас ещё и алерты в коде... время реакции пользователя вы тоже не контролируете
0
133 / 118 / 34
Регистрация: 04.04.2018
Сообщений: 593
11.02.2019, 15:21  [ТС]
kalabuni, все верно, все так как Вы и пишите. В 25 строчке и есть setTimeout(), когда ответ приходит, тогда я снова вызываю в 91 строчке запуск таймера на 5 секунд.

Добавлено через 1 минуту
Интервал времени с каждым разом увеличивается и увеличивается. Именно это мне не понятно, почему так происходит. Когда первые 1-2-3 обрабатываются в течение 5 секунд, а потом начинает время интервала увеличиваться. Даже уже на третьем запуске таймера это видно, дальше больше. Все как на скрин-шоте происходит.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
11.02.2019, 15:25
u4en1k, я не знаю псевдоязыка jquery, но предполагаю, что ответ сервера -- это где-то в success: (строка 73 вашего кода) -- вот именно там, после обработки ответа, и должен быть прописан setTimeout ()
0
133 / 118 / 34
Регистрация: 04.04.2018
Сообщений: 593
11.02.2019, 15:32  [ТС]
kalabuni, вызывается функция в 91 строчке, которая запускает снова setTimeout() в 25 строчке, после 5 секунд снова отправлять должен запрос. Вот в чем все дело, оно зацикленно и срабатывает, но вот почему время интервала с каждым разом увеличивается не понятно. Работа так же производится исключительно с цифрами в самом php обработчике.

Добавлено через 1 минуту
Ответ более минуты, а от и все две после последнего ответа, а там еще более.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
11.02.2019, 15:33
увеличение интервала -- это обычно следствие одновременной работы двух и более таймеров на странице
используйте переменную myTimer при первом же запуске таймера, потом сбрасывайте её методом clearTimeout () при следующем запуске таймера
я ещё не встречал задачи, при которой необходима одновременная работа двух и более таймеров -- всегда достаточно одного... и вам одного работающего хватит.
1
133 / 118 / 34
Регистрация: 04.04.2018
Сообщений: 593
11.02.2019, 16:08  [ТС]
kalabuni, спасибо за совет. Частично с Вами соглашусь, 1 может хватить, если прописать условие и считать секунды, когда будет 5 вызывать send_contract() но почему-то у меня это не получилось реализовать. А код выглядел примерно так.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var check_time = '0';
function time_two() {  // функция таймера для вывод времени сколько осталось до завершения торгов
     var timeend = new Date(<?php echo $end_date; ?>);  // дата и время завершения торгов
    today = new Date(); // текущая дата и время
    today = Math.floor((timeend-today)/1000); // считаем
     if(today < 0){ // если меньше нуля
        alert('Время вышло');  // выводим сообщение
     }
    else if(today > 0){ // более нуля
    // считаем время
            tsec=today%60; today=Math.floor(today/60); if(tsec<10)tsec='0'+tsec;
        tmin=today%60; today=Math.floor(today/60); if(tmin<10)tmin='0'+tmin;
        thour=today%24; today=Math.floor(today/24);
        // вывод в блок
         document.getElementById('t').innerHTML = "До конца торгов осталось "+today +" дней "+ thour+" часов "+tmin+" минут "+tsec+" секунд";
         document.getElementById('t').style='font-size:14px;color:#00e200;';
        ++check_time;
        if(check_time == 5){
            send_contract(); // вызов функции ajax запроса.
            check_time = '0';       
        }
        var time_active = setInterval(time_two, 1000); // вызываем функцию time_two, то есть саму себя через секунду
    }
}
Может тут я что-то не так делаю? Но в результате почему-то получалось, что переменная check_time была 0 после 1 вызова. Читал, гуглил, что-то не получилось.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
11.02.2019, 17:45
Лучший ответ Сообщение было отмечено u4en1k как решение

Решение

вы не поняли, поэтому ещё раз: инструкций myTimer = setTimeout () в коде может быть хоть тысяча штук
главное, чтобы единовременно работал только один таймер, вызванный последним
т.е. вызовы таймеров должны быть оформлены так:
JavaScript
1
2
3
4
5
6
7
var myTimer = setTimeout (, 1000); // вызов первого таймера на 1 секунду
 
clearTimeout (myTimer); // перед вызовом второго таймера
myTimer = setTimeout (, 5000); // используем эту же переменную для второго таймера на 5 секунд
 
// и т. д. -- переменная одна и та же (для любых функций и для любой длительности задержки)
// и всякий раз не забываем её предварительно сбрасывать
считать, если есть такая необходимость, надо будет внутри функций, вызываемых инструкцией setTimeout ()
например, организовано движение рыбок в аквариуме -- с разной скоростью и в разных направлениях
соответственно, для первой (медленной и плывущей направо) рыбы значение style.left изменится на 1 пиксель, а для второй рыбы (быстрой и плывущей налево) -- на -2 пикселя
аналогично работают часы, показывающие время в разных городах мира: движок часов (таймер) -- он один, а часы, минуты и секунды вычисляются внутри функции для каждого циферблата
1
133 / 118 / 34
Регистрация: 04.04.2018
Сообщений: 593
12.02.2019, 08:15  [ТС]
kalabuni, Утро доброе, получилось. Чуть изменил код и прописал вызов метода clearTimeout () как Вы и посоветовали. Заработало корректно. Еще раз спасибо.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
12.02.2019, 08:26
u4en1k, рад за вас
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.02.2019, 08:26
Помогаю со студенческими работами здесь

setTimeout
вот ф-ция setTimeout (function(){ jQuery(document).ready(function(){ // Instantiate jTicker jQuery(&quot;#ticker&quot;).ticker({ ...

SetTimeout
Привет знатокам. У меня не большая проблема с таймером. Хочу что бы сообщение выбилось через 1 секунду. ...

Не выполняеться setTimeout
Данный код выполняется но без 3-х секундной задержки. Он выполняется моментально. Подскажите в чём может быть причина. ...

Не срабатывает setTimeout()
Добрый вечер почему то не срабатывает setTimeout(); &lt;html&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;&gt; &lt;script...

Проблема с SetTimeout
Доброго времени суток. Недавно начал изучать JS. Есть такой небольшой код: $(document).ready(function() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru