Форум программистов, компьютерный форум, киберфорум
Наши страницы

JavaScript

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.81
Леха
0 / 0 / 0
Регистрация: 29.05.2012
Сообщений: 12
#1

setInterval вызов одной функции с разными параметрами - JavaScript

29.05.2012, 13:23. Просмотров 4828. Ответов 15
Метки нет (Все метки)

Добрый день.

Подскажите, пожалуйста, как нужно каждые 5 секунд вызывать одну функцию с разными параметрами.

пример функции
Javascript
1
2
3
4
5
6
7
var page_1 = 0;
var page_2 = 1;
var page_3 = 2;
var timeleft = 2000; // каждые 2 сек
setInterval(('scroll('+page_1+')',timeleft);
setInterval(('scroll('+page_2+')',timeleft);
setInterval(('scroll('+page_3+')',timeleft);
Как это реализовать? иначе они цикляться и постоянно дергаются.
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2012, 13:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос setInterval вызов одной функции с разными параметрами (JavaScript):

Как работает циклический вызов setInterval? - JavaScript
Все доброго дня. Подскажите как работает циклический вызов setInterval? Меня интересует момент: если первый цикл функции еще не успел...

Вызов одной функции внутри другой - JavaScript
function sold(p,n){ alert('test'); var z=n-1; for( ;z!=-1;z--){ ...

Конструктор с разными параметрами - JavaScript
...извините что обращаюсь, сам не местный...))) пробую создать обьект и написать конструктор. Загвоздка в том что в JS (кажеться)...

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

setInterval co значениями внутри функции - JavaScript
Хочу чтобы у меня срабатывал setInterval каждую секунду, но проблема в следующем, когда вставляешь туда функцию setInterval, 1000) -...

Повторный вызов Excel с параметрами - JavaScript
У меня такая проблема: есть программа, при запуске которой теряется возможность доступа к остальным файлам (убирается кнопка Пуск,...

15
GuardCat
Просто любитель
618 / 458 / 19
Регистрация: 20.01.2011
Сообщений: 860
Записей в блоге: 2
29.05.2012, 14:16 #2
Необходимо запускать следующий таймер только после того, как отработал предыдущий. Я написал для вас вариант решения: функцию для запуска функций.
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
/**
  Вызывает указанную функцию с каждым из
  указанных аргументов с перерывом в ms миллисекунд.
  
  @param fn {function} функция для вызова
  @param args {array} массив аргументов
  @param ms {int} задержка между вызовами в мс.
*/
function callForEach(fn, args, ms) {
  var n = 0;                      //Счётчик для переключения аргументов.
  
  setTimeout(                     // Первый запуск.
    function caller() {           // Функция-обёртка для хранения счётчика. 
      fn(args[n++]);              // Вызываем функцию с очередным аргументом и прибавляем счётчик одновременно.
      if (n < args.length) {
        setTimeout(caller, ms);   // Если ещё не все аргументы перебрали, обёртка запускает сама себя через указанное время.
      }
    },
    ms
  )
}
 
//Ниже — пример: нужно вызвать функцию show с каждым элементом массива arr, с интервалом 1с.
 
arr = [0, 1, 2, 3];
function show(text) {
  alert(text);
}
// Запускаем
callForEach( show, arr, 1000);
1
Леха
0 / 0 / 0
Регистрация: 29.05.2012
Сообщений: 12
29.05.2012, 15:08  [ТС] #3
Цитата Сообщение от GuardCat Посмотреть сообщение
Необходимо запускать следующий таймер только после того, как отработал предыдущий. Я написал для вас вариант решения: функцию для запуска функций.
Спасибо работает, но не запускает по кругу массив, а обрывает после окончания массива. Пробовал менять setTimeout на setInterval, начинают происходить дикие глюки.
0
GuardCat
Просто любитель
618 / 458 / 19
Регистрация: 20.01.2011
Сообщений: 860
Записей в блоге: 2
29.05.2012, 15:18 #4
Цитата Сообщение от Леха Посмотреть сообщение
... работает, но не запускает по кругу массив, а обрывает после окончания массива.
Чётче формулируйте задачу. Если надо непрерывно, то так:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
function callForEach(fn, args, ms) {
  var n = 0;                      //Счётчик для переключения аргументов.
  
  setTimeout(                     // Первый запуск.
    function caller() {           // Функция-обёртка для хранения счётчика. 
      fn(args[n++]);              // Вызываем функцию с очередным аргументом и прибавляем счётчик одновременно.
      if (n >= args.length) n = 0;
      setTimeout(caller, ms);
    },
    ms
  )
}
Цитата Сообщение от Леха Посмотреть сообщение
Спасибо...
Для «Спасибо» есть кнопка на полезном сообщении.
1
Леха
0 / 0 / 0
Регистрация: 29.05.2012
Сообщений: 12
29.05.2012, 15:27  [ТС] #5
Спасибо большое, подумал и разобрался.

Вынес в отдельную функцию
Javascript
1
2
3
4
5
6
arr = [0, 1, 2, 3];
function show(text) {
  alert(text);
}
// Запускаем
callForEach( show, arr, 1000);
и запустил через setInterval

Добавлено через 8 минут
GuardCat, и еще пару, как дела обстоят с памятью - если отставить на сутки - браузер не заглючит?

И второй, как сбросить счетчик переключения, либо сделать остановку цикла. Дело в том, что это слайдер, который автоматически крутится, благодаря Вам, но внизу есть кнопки переключения, если их нажимать то происходят уже глюки с перелистыванием блоков.

Спасибо.
0
kalabuni
Супермизантроп
3019 / 2375 / 422
Регистрация: 18.04.2012
Сообщений: 6,936
29.05.2012, 15:39 #6
Леха, в данном виде - заглючит.
Потому что количество открытых setTimeout () [или setInterval ()] зашкалит.
Их надо регулярно закрывать (очищать) методом clearTimeout () [clearInterval ()].
2
GuardCat
Просто любитель
618 / 458 / 19
Регистрация: 20.01.2011
Сообщений: 860
Записей в блоге: 2
29.05.2012, 16:26 #7
Леха, нет времени писать многостаночный вариант на классах. Вот простой вариант, который можно запускать/останавливать, но только для одной функции одномоментно.
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
callForEach = {
  start: function(fn, args, ms) {
    var that = this, n = 0;
    setTimeout(                     // Первый запуск.
      function caller() {           // Функция-обёртка для хранения счётчика. 
        fn(args[n++]);              // Вызываем функцию с очередным аргументом и прибавляем счётчик одновременно.
        if (n >= args.length) n = 0;
        if (that.okFlag) setTimeout(caller, ms);
      },
      ms
    )
  },
  
  stop: function() {
    this.okFlag = false;
  },
  
  okFlag: true
}
 
// Пользоваться так:
function show(text) {
  alert(text);
}
 
var arr = [0, 1, 2, 3, 4];
 
callForEach.start( show, arr, 2000); // так запускаем
 
callForEach.stop();// Так останавливаем
Леха, если браузер сутки показывает, скажем gmail, то памяти он так и так сожрёт вагон. Периодически закрывать его нужно.

kalabuni,
Цитата Сообщение от kalabuni Посмотреть сообщение
Потому что количество открытых setTimeout () [или setInterval ()] зашкалит.
setTimeout жрёт ресурсы только в случае, если последующие циклы запускаются до окончания предыдущих. Много таймаутов --- много ресурсов. В моём варианте одновременно существует один setTimeout и такого не возникает. Если есть иная информация, прошу пруф.
1
kalabuni
Супермизантроп
3019 / 2375 / 422
Регистрация: 18.04.2012
Сообщений: 6,936
29.05.2012, 16:41 #8
Свойство у объекта - оно ОДНО.
Например window.name - присвоили какое-то значение - оно ОДНО и будет, покуда не измените.

А setTimeout - это метод.
Всякое исполнение этого метода порождает внутренний объект окна Timeout, к свойствам которого нет программного доступа.
Единственное, что нам доступно - это идентификатор этого внутреннего объекта и возможность через этот идентификатор один конкретный внутренний объект из открытых очистить (закрыть) - методом clearTimeout ().

Литературы по этому делу - вагон и тележка. Поищите сами.
0
GuardCat
Просто любитель
618 / 458 / 19
Регистрация: 20.01.2011
Сообщений: 860
Записей в блоге: 2
29.05.2012, 17:21 #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
/**
  *Создаёт экземпляр CallerForEach
  *@constructor
  *@param {function} функция для вызова с аргументами
  *@param {array} массив аргументов для поочерёдного вызова функции
  *@param {integer} количество миллисекунд, через которое повторяется 
    вызов функции с очередным параметромё
*/
function CallerForEach( fn, args, ms ) {
  var n = 0, ok = true, timerId;
  
  this.start = function() {
    setTimeout ( function innerCaller() {
      fn( args[n++] );
      if ( n >= args.length ) n = 0;
      if (ok) timerId = setTimeout( innerCaller, ms );
    }, ms );
    ok = true;
  }
  
  this.stop = function() {
    ok = false;
    clearTimeout( timerId ); // Чтобы вызов не повторялся ещё один раз.
  }
}
 
// Пример применения.
var arr = [0,1,2,3,4,5];
var timer1 = new CallerForEach(show, arr, 2000);
function show(t) {
  window.console.log(t);
};
 
timer1.start(); //Запуск
 
//timer1.stop(); // остановка
После остановки, начнёт с того места, на котором остановилась.

kalabuni, garbageCollector уничтожает служебный объект после вызова первого аргумента setTimeout. С иной информацией в литературе я не сталкивался.
0
kalabuni
Супермизантроп
3019 / 2375 / 422
Регистрация: 18.04.2012
Сообщений: 6,936
29.05.2012, 18:46 #10
Цитата Сообщение от GuardCat Посмотреть сообщение
garbageCollector уничтожает служебный объект после вызова первого аргумента setTimeout.
Ну, если в вашей версии яваскрипта имеется "сборщик мусора" (таджик или китаец?), то флаг вам в обе руки.
Не знаю, правда, что это за версия и в каком-таком уникальном браузере она работает
0
GuardCat
Просто любитель
618 / 458 / 19
Регистрация: 20.01.2011
Сообщений: 860
Записей в блоге: 2
29.05.2012, 21:47 #11
Девид Флэнаган, Javascript: подробное руководство. Раздел 4.5.

В JavaScript, где не надо вручную освобождать память, реализована технология, называемая сборкой мусора (garbage collection). Интерпретатор JavaScript может обнаружить, что объект никогда более не будет использоваться программой. Определив, что объект недоступен (т.е. больше нет способа получения ссылки на него), интерпретатор выясняет, что объект более не нужен, и занятая им память может быть освобождена
0
kalabuni
Супермизантроп
3019 / 2375 / 422
Регистрация: 18.04.2012
Сообщений: 6,936
30.05.2012, 04:24 #12
GuardCat, вы, конечно, извините, но слов для вас у меня просто нет.

В общем, полагаете, что этот так называемый "сборщик мусора" - это некий волшебник, который за вас будет продумывать алгоритм и за вас "отключать" то, что вы отключить не удосужились, то полагайте так и далее.
Намекну только: сборка мусора - это освобождение памяти процессора, но никак не ликвидация JS-объектов.
-----
Цитата Сообщение от GuardCat Посмотреть сообщение
Необходимо запускать следующий таймер только после того, как отработал предыдущий.
А эта ваша фраза вообще убивает. Наповал

Обратите внимание на цикл - он с уменьшающимся индексом:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<textarea id="inf" style="width: 200px; height: 200px"></textarea>
 
<script>
var txt = document.getElementById ('inf');
 
function dt (x)
{
var d = new Date ();
txt.value += ((x < 10) ? ' ' : '') + x + ' sec:\t' +
             (d.getHours ()   / 100).toFixed (2).substr (2) +
             (d.getMinutes () / 100).toFixed (2).substr (1) +
             (d.getSeconds () / 100).toFixed (2).substr (1) + '\n';
txt.scrollTop = txt.scrollHeight;
}
 
for (var j = 60; j > 0; j--) setTimeout ('dt (' + j +')', j * 1000);
</script>
0
GuardCat
Просто любитель
618 / 458 / 19
Регистрация: 20.01.2011
Сообщений: 860
Записей в блоге: 2
30.05.2012, 06:01 #13
Цитата Сообщение от kalabuni Посмотреть сообщение
GuardCat, вы, конечно, извините, но слов для вас у меня просто нет... Намекну только: сборка мусора - это освобождение памяти процессора, но никак не ликвидация JS-объектов.
Ваше упрямство странно. Изучите js, наконец. А для начала просто подсчитайте слово "объект" в приведённой. мной цитате. Про память процессора вы отожгли. Или вы называете процессором белый ящик, подключенный к монитору?

Про то, что нельзя запускать много таймеров одновременно --- основы. Почитайте статью http://javascript.ru/setTimeout , особенно раздел "Производительность".

Постараюсь с вами больше не переписываться, поскольку человек, лишённый элементарных знаний, но снабжённый вашим упрямством, не создан для разумного разговора.
1
kalabuni
Супермизантроп
3019 / 2375 / 422
Регистрация: 18.04.2012
Сообщений: 6,936
30.05.2012, 13:21 #14
"Элементарные знания" - это как?
Вызубривание и тупое повторение написанного в сети бреда?

Javascript (как и прочие языки программирования) хорош тем, что любое утверждение любого сетевого придурка можно самому легко проверить.
0
anonimus
2152 / 1241 / 32
Регистрация: 28.04.2010
Сообщений: 4,549
30.05.2012, 14:34 #15
Цитата Сообщение от kalabuni Посмотреть сообщение
сборка мусора - это освобождение памяти процессора, но никак не ликвидация объектов.
вот дал жару )))
0
30.05.2012, 14:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2012, 14:34
Привет! Вот еще темы с ответами:

Вызов свойств объектов из массива или объекта с параметрами - JavaScript
Допустим у нас есть несколько объектов: $.Nav = { init: function(){ return this; }, ...

вызов функции из другой функции после нажатия на кнопку - JavaScript
Помогите, пожалуйста! Никак не могу понять почему не запускается функция d() Полный код: &lt;script language=&quot;javascript&quot;&gt; function...

Передача функции в функцию с параметрами - JavaScript
У меня много XMLHttpRequest запросов, и для каждого писать такое неудобно: var xhr = new XMLHttpRequest() xhr.withCredentials = true...

Вызов функции, находящейся в другой функции - JavaScript
Добрый день! Есть такая функция: function func1(p1, p2) { function func2() {alert(1);} func2(); } Мне нужно...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru