ПРИМЕЧАНИЕ: ЭТО ОТВЕТ ОТНОСИТСЯ К НАЧАЛЬНОМУ, ОЧЕНЬ ОБЩЕМУ ВОПРОСУ, ПЕРЕД ИСПОЛНЕНИЕМ, ЧТОБЫ ПОДТВЕРДИТЬ ЭКСТРЕННУЮ РЕДАКТИРОВКУ И ПРЕВРАЩАЕТСЯ В ОЧЕНЬ КОНКРЕТНО.
Это зависит от вашей конкретной среды исполнения. Теоретически JavaScript является однопоточным. Ситуация, о которой вы описываете, никогда не должна происходить. На практике, однако, это происходит (особенно внутри браузеров), и нет возможности полностью его контролировать.
Ближайшая альтернатива «управлению» - это начать с проверки значения глобальной переменной «счетчик активации». Если он равен 0, немедленно увеличивайте его и продолжайте выполнение. Уменьшите его при выходе.
Почему это не работает? Потому что две активации могут одновременно пройти тест. Поскольку переменная равна 0, оба теста будут успешными, и оба будут продолжать увеличивать переменную и выполнять. Как и в случае большинства проблем с синхронизацией/параллелизмом, проблемы не будут возникать систематически, но случайным образом время от времени. Это затрудняет обнаружение, воспроизведение и исправление.
Вы можете попытаться задать два раза для переменной, как:
if(activationCounter <= 0) {
if(activationCounter <= 0) {
activationCounter++;
// Execution
activationCounter--;
}
}
Во многих кругах это было описано в качестве решения этой проблемы, но это только уменьшает вероятность конфликта (по вполне бит, но не до нуля). Это просто результат плохого понимания шаблона с двойной проверкой блокировки. Проблемы все равно будут возникать, но с гораздо меньшей частотой. Я не уверен, что это хорошо или плохо, так как их будет еще сложнее обнаружить, воспроизвести и исправить.
Если функция не делает что-то асинхронно, это уже происходит. – Ian
Если вы расскажете больше о том, что происходит внутри функции, вопрос будет более понятным. – Sergio
@Sergio мой код добавлен –