setInterval для массива - PullRequest
       12

setInterval для массива

2 голосов
/ 23 декабря 2010

Можно ли сделать следующее с помощью javascript / jquery?

используя setInterval с массивом имен функций, если массив имеет только 1 функцию, он должен сделать следующее, если пользователь открывает веб-страницу в 10: 00: 00

function 1 - 10:00:00
function 1 - 10:00:01
function 1 - 10:00:02
function 1 - 10:00:03
function 1 - 10:00:04

затем, если пользователь нажимает другую кнопку, новое имя функции добавляется в массив, что в итоге делает следующее:

function 1 - 10:00:05
function 2 - 10:00:06
function 1 - 10:00:07
function 2 - 10:00:08
function 1 - 10:00:09
function 2 - 10:00:10
function 1 - 10:00:11
function 2 - 10:00:12
function 1 - 10:00:13

если пользователь нажимает кнопку третий раз, в массив добавляется имя новой функции, что в итоге делает следующее:

function 1 - 10:00:14
function 2 - 10:00:15
function 3 - 10:00:16
function 1 - 10:00:17
function 2 - 10:00:18
function 3 - 10:00:19
function 1 - 10:00:20
function 2 - 10:00:21
function 3 - 10:00:22

Возможно ли это? Если это возможно, может кто-нибудь помочь мне с примером сценария, как этого добиться?

Ответы [ 2 ]

6 голосов
/ 23 декабря 2010

Простой механизм:

var intervalWork = (function() {
  var workers = [], wi = 0;
  var interval = setInterval(function() {
    if (!workers.length) return;
    workers[wi](wi);
    wi = (wi + 1) % workers.length;
  }, 60 * 1000);

  return function(w) {
    workers.push(w);
  };
})();

Затем у вас есть функция под названием "intervalWork", которая позволяет добавить функцию в очередь.Будет запущена одна функция на интервал таймера (здесь 60 секунд).Функции передают свой индекс в очередь;это не кажется интересным, но позволяет распечатать эти сообщения.

Функция будет вызываться так:

intervalWork(function(index) {
  // do interesting stuff
  console.log("Function " + index + " " + new Date());
});

Или вы можете вызвать ее и передать имяуже определенной функции:

intervalWork(someRandomFunction);

Конечно, вы могли бы сделать это изумительным и обеспечить другие режимы выполнения или что-то еще.Вы не описали всю суть этого кода, поэтому я не знаю, что еще вам нужно.

edit - еще одно замечание: многие могут (справедливо) предложитьчто вместо таймера, управляемого браузерным механизмом setInterval(), лучше использовать setTimeout() и выполнить настройку каждого последующего таймера самостоятельно.Это может быть важно в тех же случаях, что и у вас, когда объем выполняемой работы не ограничен, потому что вы не контролируете, что выполняют эти «рабочие» функции.Однако базовая настройка будет такой же.

1 голос
/ 23 декабря 2010
var functions = [function () {console.log('function 1')}];
var idx = 0;

setInterval(function () {
  functions[idx]();
  idx = (idx + 1) % functions.length;
}, 1000);

// on button click:
functions.push(function () {console.log('function 2')});
...