Асинхронные функции с помощью узла Cron

#javascript #asynchronous #async-await #cron

#javascript #асинхронный #асинхронный-ожидание #cron

Вопрос:

Мне нужно запустить асинхронную функцию, написанную с помощью Puppeteer (это бот), и я хочу запускать эту функцию каждые 60 секунд. Проблема в том, что асинхронная функция (бот) выполняется в течение 2 минут, и поэтому узел cron автоматически выполняет другую асинхронную функцию, которая приводит к появлению 2 ботов, а через 5 секунд он запустит другой экземпляр этой функции.

Я хочу запустить 1-й раз, затем подождать 60 секунд и после этого выполнить его снова. Я так запутался, это мой первый проект NodeJS.

 const cron = require("node-cron")

cron.schedule("*/60 * * * * *", async () => {
    try {
        console.log(BotVote("Royjon94", "1"))
    }
    catch {
        console.log('error 404')
    }
})
  

Комментарии:

1. Ну, я не знаю о cron в node, но вы не ожидаете BotVote функции. Если эта функция выполняет асинхронную операцию, вы должны ожидать этого.

Ответ №1:

Я не уверен, cron подходит для такого рода работы. Но в принципе вы можете добиться такого же поведения с помощью базового цикла while и обещания ожидания.

 function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function BotVote() {
  await new Promise(r => setTimeout(() => {
    console.log("voting");
    r();
  })) // for illusturation purpose  
}


async function worker() {
  let i = 0;
  let keepGoing = true;
  while (keepGoing) {
    await BotVote()
    await delay(600); // imagine it's 1minute.
    i  ;
    if (i === 3) keepGoing = false; // decide when you stop
  }
}

worker();  

Комментарии:

1. Эльдар, спасибо за твой ответ, я попробовал, и он работает так, как я хотел. Очень благодарен за вашу помощь, хорошего дня.