Показать сообщение отдельно
  #4 (permalink)  
Старый 17.01.2013, 19:16
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от 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);
        }
    };

Последний раз редактировалось melky, 17.01.2013 в 19:19.
Ответить с цитированием