2015-06-24 3 views
0

Я совершенно новичок в javascript, и я пытаюсь изучить временные события. Я пытаюсь реализовать функцию, которая принимает номер и выполнить function1 за это номер раз, затем выполнить function2. Но между каждым исполнением я хотел бы иметь заданный интервал. Например, function1 отпечатки «foo» и function2 печатает «бар». Если входной номер функции равен «3», & интервал составляет 5 секунд, окончательная печать должна быть foo, foo, foo, bar, foo, foo, foo, bar .... каждые 5 секунд. Я пробовал for цикл и while цикл.Javascript: Испрашивая 2 функции в желаемый интервал

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

ответ

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 
2

Есть несколько вещей, которые вы пропустили.

  1. setInterval «устанавливает» асинхронную задачу, выполняемую в будущем (2000 мс в вашем коде). После вызова выполняется немедленное выполнение следующей строки. Кроме того, вы должны использовать setTimeout, если вы хотите, чтобы ваша задача выполнялась только один раз. setInterval заставляет задачу выполняться в бесконечном «цикле» (по крайней мере, до тех пор, пока не вызывается clearInterval).
  2. Ваше состояние while является избыточным. Я никогда не буду равен или выше 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);

+0

Спасибо за ваши указатели. Решение, однако, не работает. –

+0

Я знаю. Исправлено ... – Amit

0

Попробуйте

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

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

1

так, как я бы подойти к этому является составление списка выполнения функций для вызова в порядке:

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

Вместо setinterval для двух функций, setinterval к ​​одной функции, которые называют две функции условно.

+0

добавить код к вашему ответу –

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