Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
11 / 9 / 2
Регистрация: 23.01.2017
Сообщений: 56

Ошибка в setInterval()

15.01.2019, 19:47. Показов 1346. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
имеется код следующего типа
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'use strict';
 
class loadData{
 
  setDialog(){
      this.intervalTimer=setInterval(this.dialoger(),100);
  }
 
 dialoger(){
      console.log('hi');
 }
}
 
$(document).ready(function(){
  let obj=new loadData();
  obj.setDialog();
 
});
Проблема заключается в следующем: при выполнении программы в логе появляется лишь одно сообщение. Далее выведение сообщения не происходит. Если же в интервале создать анонимную функцию с выведением в лог - все работает.

Почему так происходит?

И второй вопрос: внутри анонимной функции нету доступа к переменным и методам этого класса. Почему?
JavaScript
1
2
3
4
5
6
7
8
9
class loadData{
 
  setDialog(){
      this.anyVar=10;
      this.intervalTimer=setInterval(function(){
         alert(this.anyVar);// Выдает ошибку
      },100);
  }
}
Спасибо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2019, 19:47
Ответы с готовыми решениями:

setInterval
Добрый вечер! помогите разобраться function func_isl(one){ var perem1 = one; $.post('isled.php', {x0:perem1}, function(data){ ...

setInterval не работает
Ну почему этот маленький зелёненький квадратик не хочет опускаться в низ? Я уже головой об стенку начинаю биться. <div...

SetInterval(); - цикл ли?
Подскажите, кто знает, как реализована функция (метод) setInterval()? Не в том плане как ей пользоваться, а как она устроена. Как функция...

11
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
15.01.2019, 20:26
Лучший ответ Сообщение было отмечено SkyderTM как решение

Решение

SkyderTM,
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class loadData{
  setDialog(){
    this.intervalTimer=setInterval(() => this.dialoger(),500);
  }
  dialoger(){
    console.log('hi');
  }
}
 
$(document).ready(function(){
  let obj=new loadData();
  obj.setDialog();
 
});
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
class loadData{
  dialoger(){
    console.log('hi');
  }
  setDialog(){
    this.intervalTimer = setInterval(this.dialoger,1000);
  }
}
 
$(document).ready(function(){
  let obj=new loadData();
  obj.setDialog();
});
Цитата Сообщение от SkyderTM Посмотреть сообщение
Почему так происходит?
Цитата Сообщение от SkyderTM Посмотреть сообщение
Почему?
Чтобы слово в слово не повторять - https://developer.mozilla.org/... ators/this
1
11 / 9 / 2
Регистрация: 23.01.2017
Сообщений: 56
15.01.2019, 20:42  [ТС]
Цитата Сообщение от Qwerty_Wasd;
Чтобы слово в слово не повторять
Спасибо за ответ.
Успел прочитать первую редакцию. Если не затруднит, поясните, пожалуйста, почему данный код был "г.. кодом"?
К критике отношусь положительно, особенно к конструктивной.
P.S. статью прочитал. Действительно много забыл. Спасибо и за нее.
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
15.01.2019, 20:50
SkyderTM, вариант со стрелочной плохо пахнет потому, что масло маслянное.
Это тоже самое как
JavaScript
1
2
3
4
5
function a () {
  function b() {
     console.log('abc');
  }
}
Единственное из-за чего её можно использовать в контексте Вашего кода, это отсутствие своего this у неё.
Поэтому поэтому она передаст в this не контекст setInterval , а setDialog

Лучше использовать второй вариант - там ссылка на функцию вместо коллбека.

Добавлено через 45 секунд
Не за что, хорошего кода
1
11 / 9 / 2
Регистрация: 23.01.2017
Сообщений: 56
15.01.2019, 20:55  [ТС]
Qwerty_Wasd,
Собственно мой dialoger и использует this в реальном коде, посему и требуется.
А я и забыл о стрелочных функциях
Буду вспоминать основы.
1
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
16.01.2019, 06:41
SkyderTM, дело не в стрелочной функции, а в том что setInterval просит функцию, т.е.
JavaScript
1
this.intervalTimer = setInterval(this.dialoger,1000);
верное решение, как было написано выше
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
16.01.2019, 09:45
EveKS, Вы все верно написали, но не к месту. Первым моим сообщением к ТС, был варик со стрелочной. Плюс рекомендации к чтению. Свой же варик назвал говнокодом. Но он был к месту в посте. Потом подумал - кому нафиг надо всё это. И изменил пост. А вот ТС успел прочитать его. Поэтому у него возник вопрос.

И поправлю Вас немного, "просит имя функции, либо ссылку на неё, либо сам код функции"
0
11 / 9 / 2
Регистрация: 23.01.2017
Сообщений: 56
16.01.2019, 11:22  [ТС]
EveKS, Да, спасибо, так действительно работает, как и писал Qwerty_Wasd, за исключением того, что нету this контекста в dialoger.
По факту,мой dialoger использует переменные объекта и изменяет их. Т.е., выходит, стрелочная - мой вариант.
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
16.01.2019, 11:31
Qwerty_Wasd, это было к
Цитата Сообщение от SkyderTM Посмотреть сообщение
А я и забыл о стрелочных функциях
Но, стрелочные функции - не та ошибка, из-за которой код вида
JavaScript
1
this.intervalTimer=setInterval(this.dialoger(),100);
не работал, в данном случае.

Не по теме:

Работал бы и вариант

JavaScript
1
2
3
  dialoger() {
    return function() { console.log('hi'); }
  }
Но это оффтоп

1
11 / 9 / 2
Регистрация: 23.01.2017
Сообщений: 56
16.01.2019, 11:37  [ТС]
EveKS, все верно, спасибо. Утром мой топ вопрос уже кажется глупым. Ведь все это не раз делалось
Вывод - надо больше спать
0
16.01.2019, 11:40

Не по теме:

EveKS, Я ведь и не говорил, что использование стрелочной - ошибка. Где Вы это нашли?

0
16.01.2019, 12:31

Не по теме:

Цитата Сообщение от Qwerty_Wasd Посмотреть сообщение
EveKS, Вы все верно написали, но не к месту
Мой ответ был, о том что можно было и не вспоминать. this на не причем
Цитата Сообщение от SkyderTM Посмотреть сообщение
А я и забыл о стрелочных функциях
Если уж говорить о решении с this, то стоило использовать
JavaScript
1
this.intervalTimer = setInterval(this.dialoger.bind(this),1000)
После этого this внутри dialoger станет указывать на верный объект

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2019, 12:31
Помогаю со студенческими работами здесь

SetInterval ,2 функции
Не получается сделать бесконечное выполнение двух функции ,с задержкой. Весь код не вижу смысла выкладывать. Есть две функции cvet() и...

SetInterval and setTimeout
Здравствуйте. Имеется такой код. var time_end = "0" + "0" + "10" + "00"; // 10 минут до начала торгов window.onload =...

setinterval кнопки
Можно ли так делать? <button id="mama">мама<\button>SetInterval('#mama', '2000');

Оптимизация setInterval()
В данном коде слишком много setInterval(). Вопрос и проблема в том как оптимизировать так чтобы было n-ое количество setInterval -ов ...

setInterval() clearInreval()
Я хочу что через 5 секунд появится одно окно а когда я закрою окно он опять не появился через 5 секунд setInterval() clearInreval()


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
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
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru