как координировать 2 функции с помощью таймеров -> javascript

#javascript #timer

#javascript #таймер

Вопрос:

Прямо сейчас я создаю небольшое приложение на javascript, но столкнулся с серьезной проблемой.

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

Я хочу спросить, есть ли какой-либо способ заставить функцию «ждать» завершения другой в javascript? Или любым другим способом или координируя эти функции между ними (в стиле мьютекса или вроде того)?

Комментарии:

1. Это JavaScript в браузере или JavaScript в какой-то автономной среде, такой как Rhino или Node.js ?

2. Решение: никаких глобальных значений, минимизировать диапазон области видимости, использовать передачу сообщений.

Ответ №1:

Javascript является однопоточным, поэтому будет практически невозможно придумать какое-либо решение типа «многопоточность». Я бы попытался придумать какой-нибудь способ использовать одну функцию и один таймер и обрабатывать разные части логики с помощью флагов. Например, может быть, вы могли бы выполнить одну часть логики, если установлен флаг A, затем установите флаг B. Когда таймер сработает снова, вы могли бы выполнить логику флага B (используя эту же функцию).

На более позитивной ноте, похоже, что HTML5 будет поддерживать многопоточность, что обнадеживает, но на самом деле это не решает проблему под рукой.

Ответ №2:

Javascript на самом деле однопоточный, за исключением того, что таймеры выполняются асинхронно.

Если это выполняется в браузере, я настоятельно рекомендую использовать новые «отложенные» объекты jQuery или любую другую платформу, которая реализует нечто подобное.

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

Комментарии:

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