anatoly_kulikov
@anatoly_kulikov
Помог ответ? Отметь решением!

Как создать очередность выполнения функций в js?

Дорогие друзья, товарищи, коллеги. Есть вопрос по JS, в данное время нет идей, как можно реализовать + опыт пока не очень (но я стараюсь, честно).

Кто-нибудь в ходе практики сталкивался с такой задачей:
- есть несколько функций, которые должны выполняться одна за другой
- в ходе их выполнения происходит взаимодействие с пользователем (т.е. ему нужно что-то ввести, какую-то кнопку нажать).
- осложняется это тем, что события в функции должны быть рандомными (т.е. есть массив объектов, которые содержат в себе данные и функцию для работы с ними).

Суть такова: эти функции выводят в элемент DOM вопросы с вариантами ответов. На данном этапе у меня получается так, что они разом выводятся в этот div и всё. А хотелось бы, чтобы следующая функция не выводилась до тех пор, пока текущая не получит ответ от пользователя. Т.е. чтобы основной поток находился в режиме ожидания до взаимодействия.

Оговорюсь сразу - использовать prompt и confirm не является решением.

Пока я решил проблему так, что нужная следующая функция вызывается в конце текущей. Но такой подход, на мой взгляд, в корне неверен.

Сейчас функций мало, массив небольшой. А если их будет большее количество (20, например) - могут возникнуть определенные сложности + если мы будем вызывать эту функцию из массива, то после неё будет исполняться следующая, что совершенно не приемлемо.
  • Вопрос задан
  • 5089 просмотров
Решения вопроса 1
@alexbutav
Подождите, прежде чем дать какой-то ответ/решение к задачи - нужно понять суть проблемы.
Прежде всего давайте разбираться с проблематикой.

Вам нужно, чтобы по событию вызывалась функция, в которой будут в определенном порядке вызываться три остальные? Причем этих остальных функций может быть N-ое количество и вызываться они должны в строгом порядке и только друг за дружкой?

Или Вам нужно показывать модальные окна, после завершения обработки каждого из которых будет вызываться следующее?

Потому что это две совершенно разные задачи и совершенно не обязательно придумывать что-то с промисами для того, чтобы вызывать друг за дружкой модальные окна.

Ну есть у Вас N-массивов, в каждом лежит сколько-то функций. В какой-то момент Вам нужно вызывать из каждого массива, по одной функции, по очереди, причем одну после другой - ну так это называется стек. Кладёте в какой-то стек указатели на объекты функций при вызове вашей основной, а потом по событию из модалок шифтите( вытаскиваете из начала ) по одной и выполняете.

Вам можно разделить отрисовку модалок или просто сделать функцию, которая будет извлекать из стека следующую и вызывать.

Вот пример с комментариями.


Но сразу хочу сказать, что это просто один из вариантов решения. Всё это конечно же можно сделать на промисах.

Пример реализации, которую я показал плоха хотя бы тем, что есть глобальные объекты, что всегда нежелательно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
dollar
@dollar
Делай добро и бросай его в воду.
function a() {}
function b() {}
function c() {}

let fn_arr = [a,b,c]; //Массив функций
let current = 0;

function onclick() { //Событие
	fn_arr[current]();
	current++;
	if (current == fn_arr.length) current = 0;
}
Ответ написан
Комментировать
@grinat
async/await а все модули всплывашек они давно уже по моему на промисах, да и обернуть в промис дело пары секунд
Ответ написан
Комментировать
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
Для реализации тестов (вы же это делаете? что-то типа тестов — последовательные вопросы с ответами) Вам достаточно две функции, показать вопрос и вывести результат.
Все остальное - это массив данных.
Есть массив данных, есть указатель текущего вопроса.
Указатель изначально указывает на первый вопрос.
Показываем этот вопрос.
Получаем ответ, сохраняем, увеличиваем указатель на единицу.
Показываем этот вопрос.
Получаем ответ, сохраняем, увеличиваем указатель на единицу.

Показываем результат.

UPD из комментария
Ответ написан
Комментировать
@newaitix
Ну что то подобное писал я. Вот 2 варианта вызова.
fn1=function(a){console.log(1);return 1;}
fn2=function(a){console.log(2,a);return 2;}
fn3=function(a){console.log(3,a);return 3;}
fn4=function(a){console.log(4,a);return 4;}
fn5=function(a){console.log(5,a);}
fn1.next=fn2;
fn2.next=fn3;
fn3.next=fn4;
fn4.next=fn5;
jsl(fn1);

fn1=function(a){console.log(1);return 1;}
fn2=function(a){console.log(a);return a;}
fn3=function(a){console.log(a);return a;}
fn4=function(a){console.log(a);return a;}
fn5=function(a){console.log(a);}
fn1.next=fn2;
fn2.next=fn3;
fn3.next=fn4;
fn4.next=fn5;
jsl(fn1);

Как реализовывал не помню смотрите здесь.
netwixell/jsl.js
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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