Как полностью остановить функцию с циклом? JS
Имею функцию, эта функция выполняется по нажатию кнопки, затем в функции срабатывает цикл, в цикле есть setTimeout с функцией замыкания. Вопрос, как по нажатию другой кнопки, сделать так чтобы функция с циклом полностью останавливалась/прерывалась?
Отслеживать
задан 8 авг 2018 в 15:40
Steg_Brind Steg_Brind
57 7 7 бронзовых знаков
Стоит добавить в вопрос имеющийся код. Сам цикл прервать никак нельзя по нажатию кнопки.
8 авг 2018 в 15:48
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Запоминать значения, возвращаемые вызовами setTimeout , и вызывать для тех из них, что еще не отработали, clearTimeout .
При чем здесь «функция замыкания» — неясно.
Отслеживать
ответ дан 8 авг 2018 в 15:42
user176262 user176262
- javascript
- функции
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.21.1314
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как остановить выполнение функции js
Чтобы остановить выполнение функции, достаточно просто вызвать инстркуцию return . Например:
const func = (num) => // если переданное число равно 2, то останавливаем работу функции if (num === 2) return; > console.log('hello'); >; func(1); // => hello func(2);
В примере выше, если вызвана функция с параметром 2, то срабатывает условие и функция прерывается благодаря return . Также можно вернуть результат из функции:
const func = (num) => // если переданное число равно 2, то останавливаем работу функции if (num === 2) return 'is number 2'; > return 'hello'; >; console.log(func(1)); // => hello console.log(func(2)); // => is number 2
return
Оператор return завершает выполнение текущей функции и возвращает её значение.
Интерактивный пример
Синтаксис
return [[выражение]];
Выражение, значение которого будет возвращено. Если не указано, вместо него возвращается undefined .
Описание
При вызове оператора return в функции её выполнение прекращается. Указанное значение возвращается в место вызова функции. Например, приведённая ниже функция возвращает возведённое в квадрат значение своего аргумента, x (где x – это число):
function square(x) return x * x; > var demo = square(3); // значение demo будет равняться 9
Если возвращаемое значение не указано, вместо него возвращается undefined .
Следующие выражения всегда прерывают выполнение функции:
return; return true; return false; return x; return x + y / 3;
Автоматическая расстановка точек с запятыми
На выражение return влияет автоматическая расстановка точек с запятыми (ASI). Разрыв строки не допускается между ключевым словом return и выражением.
return a + b;
трансформируется ASI в:
return; a + b;
В консоли появится предупреждение «unreachable code after return statement».
Примечание: Начиная с Gecko 40, предупреждение в консоли появляется, если обнаружен недостижимый код после return .
Для того, чтобы избежать данной проблемы (предотвратить ASI), можно использовать скобки:
return ( a + b; );
Примеры
Прерывание функции
Функция немедленно останавливается в точке, где вызывается return .
function counter() for (var count = 1; ; count++) // бесконечный цикл console.log(count + "A"); // до 5 if (count === 5) return; > console.log(count + "B"); // до 4 > console.log(count + "C"); // никогда не появляется > counter(); // Выводит: // 1A // 1B // 2A // 2B // 3A // 3B // 4A // 4B // 5A
Возвращение функции
Смотрите также статью о замыканиях.
function magic(x) return function calc(x) return x * 42; >; > var answer = magic(); answer(1337); // 56154
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-return-statement |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.
Как остановить выполнение функции?
Как остановить функцию при клике? К примеру когда я нажимаю на кнопку с id=»GD»
должна запустится функция timerGD(), а функции timerHY() и timerIU() перестать работать.
Как это можно сделать?
switches.addEventListener("click", (event) => < if (event.target.id == "NY") < timerNY(); console.log(1); >else < //? >if (event.target.id == "GD") < timerGD(); console.log(2); >else < //? >if (event.target.id == "IU") < timerIU(); >else < //? >>);
- Вопрос задан более года назад
- 782 просмотра
4 комментария
Простой 4 комментария
как выглядят эти функции таймеров?
Alexander3928 @Alexander3928 Автор вопроса
export function timerGD() < let timeGD = new Date("Mar 8 2023 00:00:00"); const timer = () =>< let now = new Date(); let getLeft = timeGD - now; const titleNY = "Eigth March"; const zero = "0"; let days = Math.floor(getLeft / 1000 / 60 / 60 / 24); let hours = Math.floor(getLeft / 1000 / 60 / 60) % 24; let minutes = Math.floor(getLeft / 1000 / 60) % 60; let seconds = Math.floor(getLeft / 1000) % 60; if (days < 10) days = zero + days; if (hours < 10) hours = zero + hours; if (minutes < 10) minutes = zero + minutes; if (seconds < 10) seconds = zero + seconds; document.querySelector(".title-big").textContent = titleNY; document.querySelector(".timer-days__days").innerHTML = days; document.querySelector(".timer-hours__hours").innerHTML = hours; document.querySelector(".timer-minutes__minutes").innerHTML = minutes; document.querySelector(".timer-seconds__seconds").innerHTML = seconds; >; timer(); setInterval(timer, 1000); >

clearInterval

Сделайте для каждой ф-и глобальную переменную-флаг, которые они будут проверять периодически при работе. Если флаг true — продолжают работать, false — завершаются. Примерно так:
let NY = true function timerNY() < while(NY && ваши условия повтора)< // основной код ф-ии >>
в момент когда нужно завершить работу ф-ии меняете флаг на false
NY = false
Но это один из вариантов, можно и другие сделать через интервал и очистку.
Решения вопроса 1

Web-разработчик
export function timerGD() < let timeGD = new Date("Mar 8 2023 00:00:00"); const timer = () =>< let now = new Date(); let getLeft = timeGD - now; const titleNY = "Eigth March"; const zero = "0"; let days = Math.floor(getLeft / 1000 / 60 / 60 / 24); let hours = Math.floor(getLeft / 1000 / 60 / 60) % 24; let minutes = Math.floor(getLeft / 1000 / 60) % 60; let seconds = Math.floor(getLeft / 1000) % 60; if (days < 10) days = zero + days; if (hours < 10) hours = zero + hours; if (minutes < 10) minutes = zero + minutes; if (seconds < 10) seconds = zero + seconds; document.querySelector(".title-big").textContent = titleNY; document.querySelector(".timer-days__days").innerHTML = days; document.querySelector(".timer-hours__hours").innerHTML = hours; document.querySelector(".timer-minutes__minutes").innerHTML = minutes; document.querySelector(".timer-seconds__seconds").innerHTML = seconds; >; if(!GD) < clearInterval(cl); return; >timer(); const cl = setInterval(timer, 1000); > let NY=true; let GD=true; let IU=true; switches.addEventListener("click", (event) => < if (event.target.id == "NY") < timerNY(); console.log(1); GD=false IU=false >else < //? >if (event.target.id == "GD") < timerGD(); console.log(2); NY=false IU=false >else < //? >if (event.target.id == "IU") < timerIU(); GD=false NY=false >else < //? >>);
Ответ написан более года назад
Alexander3928 @Alexander3928 Автор вопроса
К сожалению такой вариант, не работает(. Таймеры не останавливаются

Alexander3928, всё верно, отредактировал — надо было return из ф-ии добавить после очистки.
Alexander3928 @Alexander3928 Автор вопроса
Антон Горецкий, Я не знаю почему, но таймера начинают нормально переключатся, только со 2 нажатия по кнопке EIGTH MARCH. В чем может быть такой ошибки?
document.addEventListener("DOMContentLoaded", allTimer); function allTimer() < let timeNY = new Date("Jan 1 2023 00:00:00"); let timeGD = new Date("Mar 8 2023 00:00:00"); let fNY = true; let fGD = false; const timerNY = () =>< let now = new Date(); let getLeft = timeNY - now; const titleNY = "New Year"; const zero = "0"; let days = Math.floor(getLeft / 1000 / 60 / 60 / 24); let hours = Math.floor(getLeft / 1000 / 60 / 60) % 24; let minutes = Math.floor(getLeft / 1000 / 60) % 60; let seconds = Math.floor(getLeft / 1000) % 60; if (days < 10) days = zero + days; if (hours < 10) hours = zero + hours; if (minutes < 10) minutes = zero + minutes; if (seconds < 10) seconds = zero + seconds; document.querySelector(".title-big").textContent = titleNY; document.querySelector(".timer-days__days").innerHTML = days; document.querySelector(".timer-hours__hours").innerHTML = hours; document.querySelector(".timer-minutes__minutes").innerHTML = minutes; document.querySelector(".timer-seconds__seconds").innerHTML = seconds; if (!fNY) clearInterval(clearNY); >; timerNY(); const clearNY = setInterval(timerNY, 1000); const timerGD = () => < let now = new Date(); let getLeft = timeGD - now; const titleGD = "Woman's Day"; const zero = "0"; let days = Math.floor(getLeft / 1000 / 60 / 60 / 24); let hours = Math.floor(getLeft / 1000 / 60 / 60) % 24; let minutes = Math.floor(getLeft / 1000 / 60) % 60; let seconds = Math.floor(getLeft / 1000) % 60; if (days < 10) days = zero + days; if (hours < 10) hours = zero + hours; if (minutes < 10) minutes = zero + minutes; if (seconds < 10) seconds = zero + seconds; document.querySelector(".title-big").textContent = titleGD; document.querySelector(".timer-days__days").innerHTML = days; document.querySelector(".timer-hours__hours").innerHTML = hours; document.querySelector(".timer-minutes__minutes").innerHTML = minutes; document.querySelector(".timer-seconds__seconds").innerHTML = seconds; if (!fGD) clearInterval(clearGD); >; const clearGD = setInterval(timerGD, 1000); const switchesTarget = () => < const switches = document.querySelector(".switches"); switches.addEventListener("click", (event) => < if (event.target.id == "NY") < timerNY(); fNY = true; fGD = false; console.log(fNY, fGD); >if (event.target.id == "GD") < timerGD(); fNY = false; fGD = true; console.log(fNY, fGD); >>); >; switchesTarget(); >
