Javascript: 在期望的时间间隔内执行 2 个函数

Javascript: Excuting 2 functions in desired interval

我是 javascript 的新手,我正在尝试学习时间事件。我正在尝试实现一个函数,该函数接受 number 并执行 function1 number 次,然后执行 function2.但是在每次执行之间,我希望有一个固定的间隔。例如,function1 打印 "foo",function2 打印 "bar"。如果函数的输入数字是“3”且间隔是 5 秒,则最终打印应该是 foo,foo,foo,bar,foo,foo,foo,bar .... 每 5 秒间隔一次。 我试过 for 循环和 while 循环。

var i=0;
while (i < 4){//number of times to repeat "function"
    if (i%4 == 0){
        setInterval(function(){
            console.log("bar");
        },2000);//interval between functions
    }
    else{
        setInterval(function(){
            console.log("foo");
        },2000);//interval
    }
    i++;
    if (i==4) i = 0;
}
function fooBar(foo,delay){
    var i=1;
    setInterval(function(){
        if (i%(foo+1) ==0){
            console.log("BAR");
        }
        else {
            console.log("foo");
        }
        i++;
        //set i back to 0. not necessary, though
        if (i==(foo+1)){
            i=0;
        } 
    },delay);
}
fooBar(3,1000);//number of "foo"s , delay in ms

您错过了很多事情。

  1. setInterval "sets" 一个在未来某个时间执行的异步任务(在您的代码中为 2000 毫秒)。调用完成后,立即继续执行下一行。此外,如果您希望您的任务仅 运行 一次,则应使用 setTimeoutsetInterval 导致任务无限执行 "loop"(至少直到 clearInterval 被调用)。
  2. 您的 while 条件是多余的。 I 永远不会等于或高于 4,因为您在 while 块中重置了它(在最后一个 if 中)。这似乎是故意的,但根本没有理由有条件(使用 while(true)

实现您想要的解决方案可能是:

var maxPrints = 20; // Otherwise this will never end...

function nextInterval(i) {
  console.log(i == 0 ? 'bar' : 'foo');
  if(--maxPrints > 0)
    setTimeout(function() { nextInterval((i + 1) % 4); }, 2000);
}
nextInterval(0);

或者您可以像这样通过一次调用 setInterval 来完成:

var maxPrints = 20; // Otherwise this will never end...
var i = 0, interval;

function nextInterval() {
  console.log((i++ % 4) == 0 ? 'bar' : 'foo');
  if(--maxPrints <= 0)
    clearInterval(interval);
}
interval = setInterval(nextInterval, 2000);

尝试

var i = 0,
  num = 3,
  interval = setInterval(function() {
    if (i < num) {
      console.log('foo')
    } else {
      console.log('bar')
    }

    if (i++ == num) {
      i = 0;
    }
  }, 500);

我的方法是制作一个 运行 按顺序调用的函数列表:

function loopFunctions(functions, delay)
{
    var i = 0;

    return setInterval(function() {
        // call current function
        functions[i]();
        // advance pointer and loop if necessary
        i = (i + 1) % functions.length;
    }, delay);
}

var foo = function() { console.log('foo'); };
var bar = function() { console.log('bar'); };

loopFunctions([foo, foo, foo, bar], 2000);

填充该数组相对容易:

var fns = Array.apply(null, new Array(3)).map(function() { 
    return foo; 
}).concat([bar]);

不是将 setinterval 设置为两个函数,而是将 setinterval 设置为有条件地调用两个函数的一个函数。