Я хотел бы добавить задержку / сон внутри while
цикла:
Я попробовал это так:
alert('hi');
for(var start = 1; start < 10; start++) {
setTimeout(function () {
alert('hello');
}, 3000);
}
Только первый сценарий верен: после показа alert('hi')
он будет ждать 3 секунды, затем alert('hello')
будет отображаться, но затем alert('hello')
будет повторяться постоянно.
Я хотел бы, чтобы после alert('hello')
3 секунд показывалось, после alert('hi')
этого нужно подождать 3 секунды во второй раз alert('hello')
и так далее.
источник
for in
цикла?Object.keys()
setTimeout
сsetInterval
. Тайм-ауты неявно уничтожаются при вызове обратного вызова.Попробуйте что-то вроде этого:
источник
Если вы используете ES6, вы можете использовать
let
для этого:Что
let
объявляетсяi
для каждой итерации , а не цикла. Таким образом, то, что передаетсяsetTimeout
именно то, что мы хотим.источник
i*3000
аргумента внутри цикла и передает егоsetTimeout
по значению. Использование неlet
является обязательным и не связано с вопросом и ответом.i < 10
), так что у вас будет несколько параллельных таймеров, которые создают распределение памяти, и это хуже при большем количестве итераций.Начиная с ES7, есть лучший способ ожидания цикла:
Когда двигатель достигает
await
детали, он устанавливает тайм-аут и останавливает выполнениеasync function
. Затем, когда время ожидания истекает, выполнение продолжается в этот момент. Это весьма полезно, поскольку вы можете отложить (1) вложенные циклы, (2) условно, (3) вложенные функции:Ссылка на MDN
Хотя ES7 теперь поддерживается NodeJS и современными браузерами, вы можете захотеть перенести его с BabelJS, чтобы он работал везде.
источник
break;
может быть?Другой способ - увеличить время ожидания, но учтите, что это не похоже на сон . Код после цикла будет выполнен немедленно, только выполнение функции обратного вызова откладывается.
Первый таймаут будет установлен на
3000 * 1
, второй на3000 * 2
и так далее.источник
start
внутри своей функции, используя этот метод.Это будет работать
Попробуйте эту скрипку: https://jsfiddle.net/wgdx8zqq/
источник
$.Deferred
но это был какой-то другой сценарий, чтобы это сработало, превью! ..!Я думаю, вам нужно что-то вроде этого:
Тестовый код:
Примечание: использование предупреждений останавливает выполнение JavaScript, пока вы не закроете предупреждение. Это может быть больше кода, чем вы просили, но это надежное решение для повторного использования.
источник
Я бы наверное использовал
setInteval
. Как это,источник
SetInterval()
порождает «потоки» даже в случае какой-либо ошибки или блока.В ES6 (ECMAScript 2015) вы можете выполнять итерацию с задержкой с генератором и интервалом.
Пример кода:
Так что, если вы используете ES6, это самый элегантный способ добиться цикла с задержкой (на мой взгляд).
источник
Вы можете использовать оператор интервала RxJS . Интервал выдает целое число каждые x секунд, а значение take указывает, сколько раз он должен выдавать числа
источник
Просто подумал, что выложу здесь свои два цента. Эта функция запускает итерационный цикл с задержкой. Смотрите это jsfiddle . Функция выглядит следующим образом:
Например:
Будет эквивалентно:
источник
Я делаю это с помощью Bluebird's
Promise.delay
и рекурсии.источник
В ES6 вы можете сделать следующее:
В ES5 вы можете сделать как:
Причина в том, что
let
вы можете объявлять переменные, которые ограничены областью действия оператора блока или выражением, в котором он используется, в отличие отvar
ключевого слова, которое определяет переменную глобально или локально для всей функции независимо от области действия блока.источник
Показать фрагмент кода
Модифицированная версия ответа Даниэля Вассалло с переменными, извлеченными в параметры, чтобы сделать функцию более пригодной для повторного использования:
Сначала давайте определим некоторые существенные переменные:
Далее вы должны определить функцию, которую хотите запустить. Это будет передано i, текущий индекс цикла и длина цикла, в случае, если вам это нужно:
Самоисполняющаяся версия
Функциональная версия
источник
источник
Ты делаешь это:
источник
источник
Вот как я создал бесконечный цикл с задержкой, которая прерывается на определенное условие:
Ключевым моментом здесь является создание нового Обещания, которое разрешается по таймауту, и ждать его разрешения.
Очевидно, вам нужна поддержка async / await для этого. Работает в Узле 8.
источник
для обычного использования "забудь нормальные циклы" и используй эту комбинацию "setInterval" включает в себя "setTimeOut": like this (из моих реальных задач).
PS: Поймите, что реальное поведение (setTimeOut): они все начнутся в одно и то же время «три бла-бла-бла начнут обратный отсчет в один и тот же момент», поэтому сделайте другой тайм-аут, чтобы организовать выполнение.
PS 2: пример для цикла синхронизации, но для циклов реакции вы можете использовать события, обещают асинхронное ожидание ..
источник
источник
Насколько мне известно,
setTimeout
функция вызывается асинхронно. Что вы можете сделать, это обернуть весь цикл в асинхронную функцию и ждать,Promise
что содержит setTimeout, как показано:И тогда вы звоните запустить его так:
Пожалуйста, найдите время, чтобы получить хорошее представление об асинхронном программировании.
источник
Просто попробуйте это
результат
источник
Вот функция, которую я использую для цикла по массиву:
Вы используете это так:
источник
Этот скрипт работает для большинства вещей
источник
Попробуй это...
источник
Простая реализация показа фрагмента текста каждые две секунды, пока работает цикл.
источник
Попробуй это
источник