Как выполнить серию функций с интервалами в javascript?

Я хочу выполнить ряд функций по порядку и с интервалом в 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?

Я запустил main1, и он вызывает три функции с разницей в секунду. Какая у вас проблема?

chris.va.rao 14.04.2019 06:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
162
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не уверен, почему функция 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 — ошибка, я его удалил.

NiaBie 14.04.2019 09:30

Я использую функцию myPause вместо setTimeout, потому что я хочу, чтобы функция оставалась в режиме ожидания до тех пор, пока myPause не завершится.

NiaBie 14.04.2019 09:35

Если вы используете что-то вроде myPause, функция на это время будет приостановлена, буквально ничего не делая (процессор будет занят ничем). Похоже, вам нужно что-то вроде функции sleep() из других языков, которая заставляет выполнение ждать некоторое время, но тем временем процессор может делать другие вещи. Если это так, вы можете использовать промисы JS для реализации, как показано здесь.

pdpino 15.04.2019 05:05

Есть много способов сделать это. Это один из них:

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, если хотите выполнить очередь только один раз.

Другие вопросы по теме