数组上的setInterval

时间:2010-12-23 14:56:55

标签: javascript settimeout setinterval

是否可以使用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 个答案:

答案 0 :(得分:6)

一个简单的机制:

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);

你当然可以让这个更有魅力并提供其他执行模式,或者其他什么。你没有描述这段代码的整体要点,所以我真的不知道你还想要什么。

编辑 - 还有一个注意事项:很多人可能(正确地)建议使用setInterval()机制,而不是由浏览器的setTimeout()机制驱动的计时器。并自己完成设置每个后续计时器的工作。这在很像你的情况下很重要,因为你不能控制那些“工人”功能的作用,因此完成的工作量是无限的。然而,基本设置是相同的。

答案 1 :(得分:1)

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')});