Есть ли способ заснуть в JavaScript, прежде чем он выполнит другое действие?
Пример:
var a = 1+3;
// Sleep 3 seconds before the next action here
var b = a + 4;
javascript
sleep
Джин Ён
источник
источник
Если вам действительно нужно
sleep()
что-то протестировать. Но имейте в виду, что во время отладки в большинстве случаев это приведет к сбою браузера - вероятно, поэтому он вам все равно нужен. В производственном режиме я закомментирую эту функцию.Не используйте
new Date()
в цикле, если вы не хотите тратить впустую память, вычислительную мощность, батарею и, возможно, весь срок службы вашего устройства.источник
Версия ECMAScript 6, использующая генераторы с yield для «блокировки кода»:
Поскольку исходный вопрос был опубликован семь лет назад, я не стал отвечать точным кодом, потому что это слишком просто и уже дан ответ. Это должно помочь в более сложных проблемах, например, если вам нужно как минимум два сна или если вы планируете упорядочить асинхронное выполнение. Не стесняйтесь изменять его под свои нужды.
функция *
() => стрелочная функция
Вы также можете связать события через обещания :
Или гораздо более простой и менее изящный способ был бы
Если вы просто ждете, когда произойдет какое-то условие, вы можете подождать вот так
источник
Обновление 2018
Последние версии Safari, Firefox и Node.js теперь также поддерживают async / await / promises.
Использование async / await / Promises:
(С 1/2017 поддерживается в Chrome, но не в Safari, Internet Explorer, Firefox, Node.js)
Обновление 2017 г.
JavaScript эволюционировал с тех пор, как был задан этот вопрос, и теперь у него есть функции генератора, а также выпускается новый async / await / Promise.
Ниже приведены два решения: одно с функцией генератора, которое будет работать во всех современных браузерах, а другое, использующее новый async / await, который еще не поддерживается повсеместно.Используя функцию генератора:
Обратите внимание на то, что оба эти решения носят асинхронный характер. Это означает, что myAsyncFunc (в обоих случаях) вернется во время сна.
Важно отметить, что этот вопрос отличается от того, что такое JavaScript-версия sleep ()? где инициатор запроса запрашивает настоящий сон (отсутствие выполнения другого кода в процессе), а не задержку между действиями.
источник
let co = gen => (...args) => { let iter = gen(...args); let resume = () => new Promise((resolve, reject) => { let result = iter.next(); if (result.done) resolve(result.value); else Promise.resolve(result.value).then(resume).then(resolve, reject); }); return resume(); };
позволит вамlet asyncAdd = co(function* (a, b) { console.log('Sleeping'); yield sleep(3000); console.log('Done'); return a + b; }); asyncAdd(3, 4).then(console.log);
использовать определениеsleep()
из вашего второго блока кода.Если вам нужны менее неуклюжие функции, чем
setTimeout
иsetInterval
, вы можете заключить их в функции, которые просто меняют порядок аргументов и дают им красивые имена:Версии CoffeeScript:
Затем вы можете использовать их с анонимными функциями:
Теперь он легко читается как «через N миллисекунд, ...» (или «каждые N миллисекунд, ...»)
источник
Другой способ сделать это - использовать Promise и setTimeout (обратите внимание, что вам нужно находиться внутри функции и установить ее как асинхронную с ключевым словом async):
источник
Вот очень простой способ сделать это, который «ощущается» как синхронный сон / пауза, но является допустимым асинхронным кодом js.
источник
Вы можете использовать простой javascript, это вызовет вашу функцию / метод через 5 секунд:
источник
Есть несколько способов решить эту проблему. Если мы используем
setTimeout
функцию, давайте сначала познакомимся с ней. Эта функция имеет три параметра:function
илиcode
,delay
(в миллисекундах) иparameters
. Поскольку параметр функции или кода является обязательным, остальные необязательны. Если вы не вошли в задержку , она будет установлена на ноль.Для получения более подробной информации
setTimeout()
перейдите по этой ссылке .Упрощенная версия:
Используя передачу параметров:
Поддержка браузера:
источник
Это моя модель, которая показывает, как «засыпать» или «DoEvents» в javascript с помощью функции генератора (ES6). Прокомментированный код:
источник
Попробуйте эту функцию:
Вот как вы его используете:
Или используйте стиль обещания:
Вот демо .
источник