Нажатие кнопки и время ожидания вызова той же функции в JavaScript - PullRequest
0 голосов
/ 12 ноября 2018

Я работаю над ионным проектом, и в рамках этого проекта пользователь должен будет выполнить синхронизированное задание. Они должны ответить на вопрос с множественным выбором за 15 ~ секунд, в противном случае они не справятся с заданием.

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

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

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Лучший подход в этом сценарии не очень сложен.Таким образом, триггер тайм-аута, а также кнопка отправки вызывают одну и ту же функцию evaluate.

Все, что вам нужно сделать, это сделать это.Отключите кнопку отправки сразу при открытии функции, а затем напишите, что вы хотите сделать.Поэтому, если тайм-аут вызывает функцию в первую очередь, кнопка будет отключена перед выполнением операций, и пользователь больше не сможет нажимать кнопку.Если кнопка нажата первой, она идет как надо, и здесь нет никаких сложностей.

0 голосов
/ 12 ноября 2018

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

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

0 голосов
/ 12 ноября 2018

У вас может быть переменная с именем что-то вроде "eval_running", которую вы проверяете в своей функции оценки. Если оно ложно, вы устанавливаете его в true и продолжаете оценку. Если это правда, вы возвращаетесь из функции без оценки. Когда вы отображаете следующую задачу, вы сбрасываете переменную в false.

Это предотвратило бы любое состояние гонки. Временной интервал, в течение которого может выполняться двойное выполнение, зависит от того, как долго функция eval работает в фоновом режиме. Скорее всего, вам не нужно беспокоиться об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...