Javascript: принудительно введите новую итерацию цикла в setInterval

У меня есть цикл setInterval. Он установлен в 3500 миллисекунд, например: -

var loop = setInterval(function() { /*stuff*/ }, 3500);

В какой-то момент в «stuff», если возникает определенная ситуация, я хочу заставить новую итерацию цикла и NOT WAIT для 3500 миллисекунд. Как это возможно? Продолжается или мне просто нужно оформить процесс по-другому?

0
Самый чистый способ - реализовать метод, который называет себя «определенными обстоятельствами».
добавлено автор Florian Salihovic, источник
Вместо этого используйте self-call setTimeout . Гораздо проще, чище, я все равно предпочитаю.
добавлено автор Jared Farrish, источник

5 ответы

Вы можете попробовать написать анонимную функцию самозапуска с помощью setTimeout вместо setInterval :

var i = 0;

(function() {
   //stuff
    i++;
    if (i % 2 == 0) {
       //If some condition occurs inside the function, then call itself once again
       //immediately
        arguments.callee();
    } else {
       //otherwise call itself in 3 and a half seconds
        window.setTimeout(arguments.callee, 3500);
    }
})();​//<-- call-itself immediately to start the iteration

ОБНОВИТЬ:

Из-за несогласия, выраженной в разделе комментариев, против использования arguments.callee , вот как это можно было бы сделать, используя именованную функцию:

var i = 0;
var doStuff = function() {
   //stuff
    i++;
    if (i % 2 == 0) {
       //If some condition occurs inside the function, then call itself once again
       //immediately
        doStuff();
    } else {
       //otherwise call itself in 3 and a half seconds
        window.setTimeout(doStuff, 3500);
    }
};
doStuff();
2
добавлено
Хорошо, я обновил сообщение на примере использования именованной функции.
добавлено автор Darin Dimitrov, источник
О, классно. Моя попытка более или менее одинаковая (хотя я понимаю, что не сохраняю ни одну из ссылок к setTimeout после первого ... hmm). И что с goofy window.setTimeout ?
добавлено автор Jared Farrish, источник
Я не согласен с использованием arguments.callee . Вы должны использовать именованные функции. Я думаю, что строгий режим даже не позволяет использовать это свойство.
добавлено автор John Dvorak, источник

Вы можете использовать что-то вроде этого ... используя setTimeout вместо setInterval ...

<script type="text/javascript">
    var show;
    var done = false;

    show = setTimeout(showHideForm, 3500);

    function showHideForm() {
       //Do something

        if(done) {
            clearTimeout(show);

            show = setTimeout(showHideForm, 2000);
        }
    }
</script>

clearTimeout takes as argument the handle which is returned by setTimeout.

2
добавлено
@JaredFarrish Я не понял, что вы подразумеваете под дублирующим кодом.
добавлено автор ATOzTOA, источник
@JaredFarrish Как еще я это делаю?
добавлено автор ATOzTOA, источник
@JaredFarrish Wow, kool ...
добавлено автор ATOzTOA, источник
Вы можете (function showHideForm() {})() , чтобы у вас не было дублированных фрагментов кода.
добавлено автор Jared Farrish, источник
У вас есть show = setTimeout (showHideForm, # 000); дважды. СУХОЙ, правильно?
добавлено автор Jared Farrish, источник
Поместите () () вокруг showHideForm() {} (первая скобка). Некоторые люди называют это сразу вызываемой функцией или функцией самозапускания. Это неважно, но когда я вижу, что микро-повторение в моем собственном коде, это всегда раздражает меня, как это делают мелкие вещи, вы знаете? В любом случае, вы можете увидеть их в действии в моем ответе и Дарина.
добавлено автор Jared Farrish, источник

Используйте именованную функцию и вызовите ее, когда захотите.

var loop = setInterval(loopFunc, 3500);

function loopFunc(){
  //do something
}

function anticipate(){
  clearInterval(loop);  //Stop interval
  loopFunc();  //Call your function
  loop = setInterval(loopFunc, 3500);  //Reset the interval if you want
}
1
добавлено
function looper(t) {
    var loop = setInterval(function() {
        document.write(s++);
        if (mycondition) {//here is your condition
            loopagain(200);//specify the time which new loop will do
            loop = window.clearInterval(loop);//clear the first interval
            return;//exit from this function!
        }
    }, t);
}

window.onload = looper(1000);//this will have default setInterval function time ans will start at window load!

function loopagain(t) {
    looper(t);
}​

http://jsfiddle.net/tFCZP/

0
добавлено
Надеюсь, поможет :)
добавлено автор Muhammad Talha Akbar, источник

Мой надуманный пример:

var time = 3500,
    loops = 0,
    loop;

(function run(){
    var wait = time,
        dontwait = false;

    if (loops++ == 5) {
        loops = 0;
        dontwait = 1000;
    }

    console.log('Interval: ', dontwait || wait);

    return loop = setTimeout(run, dontwait || wait);
})();​

http://jsfiddle.net/NX43d/1/

В принципе, функция самозапускания циклически возвращается к функции самозапуска, с переключением (!) Коротких переменных. Острота.

0
добавлено
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском