Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Модули, выполняющие задачи setTimeout()

Артемий В Ученик (89), открыт 2 недели назад
У меня есть потребность выполнения определенных действий через Nное время. Если это время небольшое, например, 1 час, тогда при использовании
 setTimeout(async () => {}, 1000 * 60 * 60) 
Все прекрасно работает, но мне может потребоваться установить таймеры и на 10, и на 20 дней. Даже на 1 день уже не работает. Есть какие-то альтернативы setTimeout() из npm модулей?
3 ответа
Максим Искусственный Интеллект (200663) 2 недели назад
  1. Не очень понятно, зачем это надо в браузере. Кто-то будет держать твою страницу открытой 10 дней?
  2. Если по какой-то причине там что-то не работает, хотя мне не понятно, что там может не работать, ты можешь по окончанию таймера запустить следующий и так в цепочке 10 раз и больше. Например, каждый час.
Артемий ВУченик (89) 2 недели назад
npm в браузере?). Я пишу, проще говоря сервер, используя node.js
Максим Искусственный Интеллект (200663) Артемий В, не вижу причин, почему там timeout может не работать. Но в любом случае можешь выполнить просто несколько раз подряд. Или вообще создать промис, который ты сможешь ожидать при помощи await. И уже с промисом работать. Можешь создать асинхронную функцию delay. И в ней рекурсивно вызывать себя же, если заданное время слишком большое.
Андрей Высший разум (435770) 2 недели назад
Если тебе нужно запускать на сервере скрипт раз в несколько минут / часов / дней / лет, то для этого используют не самописный таймер, а планировщик заданий. На Linux-сервере это будет cron.

А в браузере никто скрипт раз в несколько часов не запускает.
Артемий ВУченик (89) 2 недели назад
Если мне такое нужно, значит, что я запускаю это не в браузере, а на сервере, используя nodejs. Мне нужно, чтобы через определенное время 1 РАЗ выполнилась определённая функция. Cron выполняет задачи каждые X интервалы, а мне нужен именно timeout
Татьяна Просветленный (32633) 2 недели назад
Модули, выполняющие задачи setTimeout()
У меня есть потребность выполнения определенных действий через Nное время. Если это время небольшое, например, 1 час, тогда при использовании
setTimeout(async () => {}, 1000 * 60 * 60)
Все прекрасно работает, но мне может потребоваться установить таймеры и на 10, и на 20 дней. Даже на 1 день уже не работает. Есть какие-то альтернативы setTimeout() из npm модулей?
 const cron = require('node-cron'); 

// Запуск задачи каждый день в 00:00
cron.schedule('0 0 * * *', async () => {
// Ваша задача
});
agenda — это библиотека для планирования задач, которая поддерживает сохранение задач в базе данных (например, MongoDB), что делает её более надежной.
 const Agenda = require('agenda'); 

const agenda = new Agenda({ db: { address: 'mongodb://localhost:27017/agenda' } });

agenda.define('my task', async (job) => {
// Ваша задача
});

(async function() {
await agenda.start();
// Планирование задачи на 10 дней вперед
await agenda.schedule('in 10 days', 'my task');
})();
bull — это библиотека для создания очередей задач, поддерживающая отложенные задачи и работающая с Redis.
 const Queue = require('bull'); 

const myQueue = new Queue('my-queue', 'redis://127.0.0.1:6379');

myQueue.process(async (job) => {
// Ваша задача
});

// Планирование задачи на 10 дней вперед
myQueue.add({}, { delay: 10 * 24 * 60 * 60 * 1000 });
node-schedule:
node-schedule позволяет вам планировать задачи с использованием более гибких временных интервалов и расписаний.
 const schedule = require('node-schedule'); 

// Планирование задачи на конкретное время в будущем
const date = new Date();
date.setDate(date.getDate() + 10); // 10 дней вперед

schedule.scheduleJob(date, async () => {
// Ваша задача
});
Каждая из этих библиотек имеет свои особенности и подходит для различных случаев использования. Выбор зависит от ваших конкретных требований, например, необходимость сохранения состояния задач, работа с базами данных или очередями.
Похожие вопросы