Сообщение от Kosty@n
			 
		
	 | 
	
		Здравствуйте, уважаемые пользователи. 
У меня на странице в разное время запускаются функции setInterval, которые реализуют мигание некоторых объектов на странице. 
Как синхронизировать работу этих setInterval'ов? 
 
Пример кода. 
setInterval(function() {
        play();
} , 500);
function play() {
            for (obj in Example[iter]) {
                 //здесь что-то происходит
            }
            iter += 1;
}
 
 
Помогите интеллектом, кто сколько может  
	 | 
	
сюда отлично подойдёт реализация requestAnimationFrame для браузеров, которые не имеют реализации оной 
только что заметил, что тут не хватает нескольких функций \ переменных, но я думаю, что их название говорит само за себя.
идея в том, чтобы собрать функции в массив, а потом через время ( 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);
        }
    };