У вас есть цикл forEach, который будет повторяться 3 раза. На первой итерации оно будет:
- console.log фрейма (1)
- создать интервал, который будет выполняться за 1 секунду
- создать тайм-аут, который будет выполнен через 2 секунды
Тогда вторая итерация цикла происходит сразу после первой итерации, поэтому она будет повторяться:
- console.log фрейма (2)
- создать еще один новый второй интервал, который будет выполняться через 1 секунду
- создать еще один новый второй тайм-аут, который будет выполнен через 2 секунды
Наконец, третья итерация произойдет сразу же и будет:
- console.log фрейма (3)
- создать еще один третий новый интервал, который будет выполняться через 1 секунду
- создать еще один третий новый тайм-аут, который будет выполнен через 2 секунды
Далее все три ваших вновь созданных интервала будут выполняться примерно через 1 секунду после завершения цикла. Каждый интервал будет выполняться очень немного позади предыдущего интервала. И каждый из них содержит «замыкание» вокруг переменной frame
(то есть, когда они были созданы, они все «захватывали» кадр, когда для него было установлено значение 0
, поэтому они все console.log(0)
.
В следующую секунду каждый из 3-х интервалов будет пытаться запустить снова (теперь каждый с frame === 1
), и 3 таймаута также будут пытаться запустить. Обратите внимание, что каждый тайм-аут также сформировал «замыкание», фиксирующее значение e
во время его создания. В конечном итоге вы получаете немного ошеломляющее выполнение интервалов, смешанное с выполнением тайм-аутов.
3 таймаута случаются только один раз каждый.
Остальная часть выходных данных представляет собой набор из 3 интервалов, последовательно выполняемых с интервалом в 2 секунды между каждым набором.
Вы можете получить результат, просто используя один интервал (без петли), настроенный на срабатывание каждую секунду и печатая что-нибудь. Я не уверен в требованиях относительно того, сколько секунд вам нужно, чтобы эти операторы были напечатаны, поэтому я не могу дать точный код, который вам нужен, но вот что-то, что дает желаемый результат с моим лучшим предположением в данный момент:
var num = 1;
var frame = 0;
var loop = setInterval( function() {
if (frame === 0) {
console.log(num);
}
if (frame >= 0 && frame <= 2) {
console.log(num + " frame " + frame);
}
if (frame === 4) {
console.log(num + " 2 seconds passed");
num++;
frame = -1;
}
if (num > 3) {
clearInterval(loop);
}
frame++;
}, 1000);