8

Как сделать паузу на определенное время в Node.js (JavaScript)?

6

Описание проблемы

Я разрабатываю консольный скрипт для личных нужд и мне необходимо сделать паузу на продолжительное время. Однако, по моим исследованиям, в Node.js нет возможности остановить выполнение кода так, как мне нужно. После определённого времени становится сложно читать информацию пользователей. Я встречал некоторые примеры кода, но они, похоже, требуют наличия другого кода для корректной работы, например:

setTimeout(function() {
}, 3000);

Тем не менее, мне нужно, чтобы всё, что идёт после этой строки, выполнялось только после истечения заданного времени.

Например:

// начало кода
console.log('Добро пожаловать в мою консоль,');

// тут должна быть пауза на десять секунд...

console.log('Бла бла бла бла, ещё немного бла');
// конец кода

Я также видел такие примеры, как:

yield sleep(2000);

Но Node.js не распознаёт это.

Как я могу реализовать такую продолжительную паузу?

5 ответ(ов)

7

Самое короткое решение без каких-либо зависимостей:

await new Promise(resolve => setTimeout(resolve, 5000));
2

Лучший способ сделать это — разбить ваш код на несколько функций, вот так:

function function1() {
    // действия, которые вы хотите выполнить сразу
    console.log('Добро пожаловать в мой консоль,');
}

function function2() {
    // все действия, которые вы хотите выполнить после задержки
    console.log('Бла бла бла бла, дополнительное-бла');
}

// вызов первой части кода сразу
function1();

// вызов остальной части кода с выполнением через 3 секунды
setTimeout(function2, 3000);

Это похоже на решение JohnnyHK, но намного аккуратнее и проще для расширения.

2

Это простая блокирующая техника:

var waitTill = new Date(new Date().getTime() + seconds * 1000);
while(waitTill > new Date()){}

Она является блокирующей, поскольку ничего другого не произойдет в вашем скрипте (например, колбэки). Но поскольку это консольный скрипт, возможно, это именно то, что вам нужно!

1

Вы можете поместить код, который хотите выполнить после задержки, внутрь колбэка функции setTimeout. Например:

console.log('Добро пожаловать в мой консоль,');
setTimeout(function() {
    console.log('Бла бла бла бла, ещё бла');
}, 3000);

В этом коде сообщение "Бла бла бла бла, ещё бла" будет выведено в консоли через 3 секунды после того, как выполнится первое сообщение.

1

В 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 секунд

Работает без проблем.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь