@the_yieao

Рекурсия в JavaScript?

Доброго времени суток всем! Есть три функции, которые надо вызывать последовательно, друг за другом, через промежуток времени. Первое что пришло в голову — вызывать поочередно из каждой функции следующую функцию, по кругу. Но тут же встал вопрос: а нормально ли такое решение с точки зрения того, что очередь вызовов накапливается (или нет? как это происходит?) и если нет, то как лучше?
Update: большое спасибо) я погуглил про промисы и понял, что это примерно то, что мне нужно, но это пока что сложно для меня)
function first() {
	// some code...
	setTimeout(second, 1000);
};

function second() {
	// some code...
	setTimeout(third, 1000);
};

function third() {
	// some code...
	setTimeout(first, 1000);
};

first();
  • Вопрос задан
  • 169 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
Она не накапливается, при срабатывании setTimeout вызов идет из event loop
https://www.google.com/search?q=js+event+loop
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
search
@search
мама говорит что я особенный
Это не нормальное решение прежде всего потому что функции знают о:
1. существовании друг друга
2. существовании некоего правила последовательности их вызова

Такой код называется высокосвязным. Высокосвязный код дорого поддерживать потому что приходится учитывать множество деталей его реализации. Учебники рекомендуют создавать как можно более обособленные функци: так называемые "чистые функции".

Сделать функции чище можно, например, так:

const delay = timeout =>
    Promise(resolve => setTimeout(() => resolve(), timeout));

async function delayedQueue() {
    first();
    await delay(1000);
    second();
    await delay(1000);
    third();
}

delayedQueue();


Как видите, теперь функции, которые необходимо вызвать с задержкой, не подозревают о существовании друг друга, а само правило последовательности их вызова инкапсулировано в отдельной функции delayedQueue.
Ответ написан
Комментировать
mmmaaak
@mmmaaak
одно слово: Promise
Ответ написан
Комментировать
@Karpion
Есть вариант "главная программа по очереди вызывает функции". Хорошо бы создать массив со ссылками на эти функции и вызывать их в цикле. Желательно вызывать не просто в цикле, а только по необходимости, чтобы не грузить процессор.

Можно вызывать функции как Вы хотите - через setTimeout(), как советовали выше. Тогда ничего не накапливается. Но это не особо хороший вариант, причины тоже объяснены выше.

Во многих современных языках программирования предусмотрено, что если вызов функции является последним оператором (вызывается внутри return или просто перед завершающей фиг.скобкой) - то вызовы не накапливаются. Но про JS - я как-то не уверен.
Ответ написан
Комментировать
zkrvndm
@zkrvndm
Архитектор решений
Вам помогут промисы, колбеки или функции генераторы. Генераторы кстати очень интересная вещь, особенно в связке с asunc / awat, можно целые ожерелья и цепочки последовательных вложенных вызовов функций создавать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы