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
您错过了很多事情。
setInterval
"sets" 一个在未来某个时间执行的异步任务(在您的代码中为 2000 毫秒)。调用完成后,立即继续执行下一行。此外,如果您希望您的任务仅 运行 一次,则应使用 setTimeout
。 setInterval
导致任务无限执行 "loop"(至少直到 clearInterval
被调用)。
- 您的
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 设置为有条件地调用两个函数的一个函数。
我是 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
您错过了很多事情。
setInterval
"sets" 一个在未来某个时间执行的异步任务(在您的代码中为 2000 毫秒)。调用完成后,立即继续执行下一行。此外,如果您希望您的任务仅 运行 一次,则应使用setTimeout
。setInterval
导致任务无限执行 "loop"(至少直到clearInterval
被调用)。- 您的
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 设置为有条件地调用两个函数的一个函数。