Как сделать паузу на определенное время в Node.js (JavaScript)?
Описание проблемы
Я разрабатываю консольный скрипт для личных нужд и мне необходимо сделать паузу на продолжительное время. Однако, по моим исследованиям, в Node.js нет возможности остановить выполнение кода так, как мне нужно. После определённого времени становится сложно читать информацию пользователей. Я встречал некоторые примеры кода, но они, похоже, требуют наличия другого кода для корректной работы, например:
setTimeout(function() {
}, 3000);
Тем не менее, мне нужно, чтобы всё, что идёт после этой строки, выполнялось только после истечения заданного времени.
Например:
// начало кода
console.log('Добро пожаловать в мою консоль,');
// тут должна быть пауза на десять секунд...
console.log('Бла бла бла бла, ещё немного бла');
// конец кода
Я также видел такие примеры, как:
yield sleep(2000);
Но Node.js не распознаёт это.
Как я могу реализовать такую продолжительную паузу?
5 ответ(ов)
Самое короткое решение без каких-либо зависимостей:
await new Promise(resolve => setTimeout(resolve, 5000));
Лучший способ сделать это — разбить ваш код на несколько функций, вот так:
function function1() {
// действия, которые вы хотите выполнить сразу
console.log('Добро пожаловать в мой консоль,');
}
function function2() {
// все действия, которые вы хотите выполнить после задержки
console.log('Бла бла бла бла, дополнительное-бла');
}
// вызов первой части кода сразу
function1();
// вызов остальной части кода с выполнением через 3 секунды
setTimeout(function2, 3000);
Это похоже на решение JohnnyHK, но намного аккуратнее и проще для расширения.
Это простая блокирующая техника:
var waitTill = new Date(new Date().getTime() + seconds * 1000);
while(waitTill > new Date()){}
Она является блокирующей, поскольку ничего другого не произойдет в вашем скрипте (например, колбэки). Но поскольку это консольный скрипт, возможно, это именно то, что вам нужно!
Вы можете поместить код, который хотите выполнить после задержки, внутрь колбэка функции setTimeout
. Например:
console.log('Добро пожаловать в мой консоль,');
setTimeout(function() {
console.log('Бла бла бла бла, ещё бла');
}, 3000);
В этом коде сообщение "Бла бла бла бла, ещё бла" будет выведено в консоли через 3 секунды после того, как выполнится первое сообщение.
В Node 7.6.0 или новее
Node поддерживает асинхронный механизм ожидания напрямую:
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));
Таким образом, если вы можете использовать асинхронные функции, то сможете написать:
await sleep(10000); // ждёт 10 секунд
или:
sleep(10000).then(() => {
// Этот код выполнится через 10 секунд
});
Для более старых версий Node (оригинальный ответ)
Мне нужно было реализовать асинхронный механизм ожидания, который работал бы как в Windows, так и в Linux, при этом не нагружая ЦП в течение долгого времени. Я пытался использовать пакет sleep, но он не установился на моем Windows окружении. В итоге я использовал:
https://www.npmjs.com/package/system-sleep
Чтобы установить его, введите:
npm install system-sleep
В вашем коде:
var sleep = require('system-sleep');
sleep(10*1000); // ждёт 10 секунд
Работает без проблем.
Использование async/await с циклом forEach
Функция map для объектов (вместо массивов)
Как получить полный объект в console.log() Node.js, а не '[Object]'?
Самый быстрый способ скопировать файл в Node.js
Обнаружена ошибка: Невозможное нарушение: Неверный тип элемента: ожидался строковый тип (для встроенных компонентов) или класс/функция, но получен объект