2014-08-31 2 views
3

Я пытаюсь добиться этого с JQuery + JavaScript:JQuery функции планирования функции

У меня есть команды/функции, которые должны быть вызваны в последовательности, с небольшой задержкой между ними. К примерам относятся изменение свойства css элемента, показывающее скрытие другого и т. Д.

У JavaScript нет функции сна, насколько мне известно. Поэтому мне интересно, есть ли в jQuery плагин или что-то, что поддерживает эту функцию?

По существу, функция вроде $(window).schedule(function() { /* do something here*/ }, 500); будет приятной. Это вызовет функцию в очередь и будет выполнено, как только будут выполнены все предыдущие функции в очереди, если в очереди нет функций, она будет выполнена немедленно. Параметр integer указывает задержку между этой функцией и предыдущей.

Я думаю, что я знаю, как построить это с нуля, но я надеюсь, что для этого есть плагин, потому что это спасет меня от переосмысления колеса.

Если нет .. Я построю это и отпустите его. :)

+0

Это зависит от ваших функций, синхронных или асинхронных ... – dashtinejad

+0

Функции должны выполняться один за другим (синхронно), однако выполняемые им «потоки» должны быть асинхронными. По сути, это будет имитировать многопоточную среду, где страница загружается/используется как обычно, но есть «фоновый поток», выполняющий функции один за другим. – l3utterfly

+2

Должно быть возможно сделать это со встроенными функциями setTimeout и setInterval, или я что-то упустил? Вы можете использовать какое-то внешнее состояние, подобное сортировке очереди, чтобы убедиться, что события завершены последовательно (хотя они все равно будут асинхронными, а не блочными, как вы пожелаете). – Shashank

ответ

3

Я не знаю конкретного плагина, который уже существует (хотя я был бы удивлен, если его не было). Но если вы просто хотите общую очередь, которая не связана с каким-либо конкретным элементом достаточно легко сделать без JQuery, возможно, что-то вроде этого:

function Scheduler() { 
    var queue = [], 
     timer, 
     next = function() { 
      var item = queue.shift(); 
      if (item) { 
       timer = setTimeout(function() { 
        item.cb.call(item.thisObj); 
        timer = null; 
        next(); 
       }, item.delay); 
      } 
     }; 
    this.schedule = function (delay, cb, thisObj) { 
     queue.push({ 
      cb: cb, 
      delay: delay, 
      thisObj: thisObj 
     }); 
     if (!timer) next(); 
     return this; 
    }; 
} 

var scheduler = new Scheduler(); 
scheduler.schedule(2000, function() { 
    $("h1").css("color", "red"); 
}); 
scheduler.schedule(500, someFunc) 
     .schedule(3000, someOtherFunc) 
     .schedule(1500, anotherFunc); 

Основного .schedule() метод возвращает экземпляр планировщика, так вы можете переадресовывать повторяющиеся вызовы, как показано. И вы можете (необязательно) передавать контекст функции обратного вызова, как показано в следующей демонстрации: http://jsfiddle.net/euggc0r2/1/

0

Использование JQuery встроенный в queue(), dequeue() и delay() методов, например:

$(function() { 
    $('#yourElement') 
     .queue('myQueue', function() { 
      /* do stuff... */ 
      // ...then tell jQuery to run the next method 
      // in the 'myQueue' queue in 2 seconds. 
      $(this).delay(2000, 'myQueue').dequeue('myQueue'); 
     }) 
     .queue('myQueue', function() { 
      /* do different stuff... */ 
      // ...then tell jQuery to run the next method 
      // in the 'myQueue' queue in 2 seconds. 
      $(this).delay(2000, 'myQueue').dequeue('myQueue'); 
     }) 
     ... 
     ... 
     ... 
     .dequeue('myQueue'); // run the first function in the queue. 
})(); 

Обычно вы бы очередь всех ваших функций, затем сделайте начальный вызов dequeue(), когда все будет готово.

Смежные вопросы