Синхронизировать события по setInterval
Здравствуйте, уважаемые пользователи.
У меня на странице в разное время запускаются функции setInterval, которые реализуют мигание некоторых объектов на странице. Как синхронизировать работу этих setInterval'ов? Пример кода. setInterval(function() { play(); } , 500); function play() { for (obj in Example[iter]) { //здесь что-то происходит } iter += 1; } Помогите интеллектом, кто сколько может :) |
Kosty@n,
Присваивайте id каждому setInterval var IntervalID_N; IntervalID_N = setInterval(function() {}); clearInterval(IntervalID_N) //Удаление; http://javascript.ru/setInterval |
Цитата:
В массив arrFunk добавляете/удаляете нужные функции function F1(a) { alert('function F1: = '+a); } function F2(a) { alert('function F2: = '+a); } var arrFunk=[F1,'a',F2,'B'];//массив запускаемых функций и параметров IntervalID_N = setInterval(function() { for(var i=0; i<arrFunk.length; i+=2){ arrFunk[i](arrFunk[i+1]); } },2500); setTimeout('arrFunk.splice(0, 2)',4000);//Удаляем 1-ю функцию с параметром; //Добавим новую функцию с параметром; setTimeout("arrFunk.push(F1,'ccc')",4100); |
Цитата:
только что заметил, что тут не хватает нескольких функций \ переменных, но я думаю, что их название говорит само за себя. идея в том, чтобы собрать функции в массив, а потом через время ( 1000 / 60 ) обойти этот массив и каждой передать одинаковую метку времени - Date.now(). // .................................... /** * Вернёт кол-во миллисекунд с 1 Января 1970 00:00:00 UTC * @return {number} */ var now = Date.now || function () { return +new Date; }; /** * Замена для requestAnimationFrame. * @param {function(number)} callback * @return {number} ID таймаута */ function rAF_imitation(callback) { var id = rAF_imitation.unique++, info = { id:id, func:callback }; if (!rAF_imitation.timerID) rAF_imitation.timerID = setInterval(rAF_imitation.looper, 1e3 / FRAMES_PER_SECOND); rAF_imitation.queue.push(info); return id; } /** * Замена для cancelRequestAnimationFrame * @param {number} id */ function rAF_imitation_dequeue(id) { var index, queue, eq; eq = function (/**@type {{id: number, func: Function}}*/val) { return val.id === id; }; queue = rAF_imitation.queue; index = LinearSearch(/**@type {Array}*/(queue), eq); if (index !== -1) { // don't splice queue[index] = null; } } /** * ID таймаута "перерисовки" * @type {number} * @private */ rAF_imitation.timerID = null; /** * Для генерации ID таймаута. * @type {Number} */ rAF_imitation.unique = 0; /** * Очередь обработчиков и их контекстов * @type {Array.<{func: Function, id: number}>} * @const */ rAF_imitation.queue = []; /** * Таймер "отрисовки" - пройдется по обработчикам и повызывает их, * передав как первый аргумент временную метку "отрисовки" * @private */ rAF_imitation.looper = function () { var reflowTimeStamp = now(), queue = rAF_imitation.queue, info; while (queue.length) { info = queue.pop(); info && info.func.call(window, reflowTimeStamp); } }; |
Часовой пояс GMT +3, время: 12:37. |