Я хочу выполнить ряд функций по порядку и с интервалом в 1 секунду, и для этого я пишу 2 функции main1 и main2:
function main1()
{
for (var i = 0; i < 3; i ++)
{
eval("myFunc_" + i + "()");
myPause(1000);
}
}
function myPause(x)
{
var start = new Date().getTime();
for (var j = start; j < start + x; j = new Date().getTime())
{
;
}
}
function main2()
{
for (var i = 0; i < 3; i ++)
{
setTimeout("myFunc_" + i + "()", i * 1000);
}
}
Я пишу функцию паузы myPause для main1, и я думаю, что эти две функции делают одно и то же, но функция main1 работает не очень хорошо. В чем проблема функции main1?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не уверен, почему функция main1 не работает, но я вижу пару проблем:
Реализация паузы, такой как myPause, блокирует выполнение и тратит процессорное время. Вы должны использовать что-то вроде setTimeout.
Вам следует избегать использования eval, см. этот вопрос для получения дополнительной информации.
Почему внешнее for внутри myPause? ждет дважды?
Я не уверен, чего вы хотите достичь, но если вы хотите что-то вроде:
в секунду 1 звоните myFunc_1
через 2 секунды звоните myFunc_2
так далее... (и ходить по списку не останавливаясь)
Вы можете сделать что-то вроде этого:
function myFunc1() { console.info('called myFunc1') }
function myFunc2() { console.info('called myFunc2') }
function myOtherFunc() { console.info('called myOtherFunc') }
const myFunctions = [
myFunc1,
myFunc2,
myOtherFunc,
];
let counter = 0;
function runMyNextFunction() {
let func = myFunctions[counter];
func();
counter += 1;
if (counter >= myFunctions.length) {
counter = 0;
}
}
setInterval(runMyNextFunction, 1000);Внешний цикл for — ошибка, я его удалил.
Я использую функцию myPause вместо setTimeout, потому что я хочу, чтобы функция оставалась в режиме ожидания до тех пор, пока myPause не завершится.
Если вы используете что-то вроде myPause, функция на это время будет приостановлена, буквально ничего не делая (процессор будет занят ничем). Похоже, вам нужно что-то вроде функции sleep() из других языков, которая заставляет выполнение ждать некоторое время, но тем временем процессор может делать другие вещи. Если это так, вы можете использовать промисы JS для реализации, как показано здесь.
Есть много способов сделать это. Это один из них:
function starter(){
var functions = [main1, main2 /*,...*/];
var functionIndex = 0;
setInterval(function(){
functions[functionIndex++]();
if (functionIndex == functions.length)
functionIndex = 0;
},1000);
}
function main1(){
console.info('main1 executed');
}
function main2(){
console.info('main2 executed');
}
// start the program
starter();
важный:
вы можете использовать setTimeout вместо setInterval, если хотите выполнить очередь только один раз.
Я запустил main1, и он вызывает три функции с разницей в секунду. Какая у вас проблема?