在 NodeJS 中安排一个异步函数

新手上路,请多包涵

我想安排一个异步函数(async/await ruturn 类型)每两分钟运行一次。

我尝试使用通用 setInterval ,节点模块,如 node-schedule ,cron,node-cron,async-poll 但无法实现异步函数调用的轮询。

这是我在代码中尝试的:

 cron.schedule("*/2 * * * *", await this.servicesManager.startPoll() => {
               console.log('running on every two minutes');
}); // this is not working breaks after first run

const job = schedule.scheduleJob(" */1 * * * *", async function() {
   try {
         return await this.ServicesManager.startPoll(); // this function startPoll is undefined when using this
       } catch (e) {
         console.log(e);
   }
   console.log('Run on every minute');
});

const event = schedule.scheduleJob("*/2 * * * *", this.ServicesManager.startPoll()); //using node-schedule , breaks after first time
cron.schedule("*/2 * * * *", await this.ServicesManager.startPoll()); // using cron same result as using node-schedule
return await this.ServicesManager.startPoll(); // without polling works

原文由 cslrnr 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 874
2 个回答

尝试这样的事情

// version 1
cron.schedule("*/2 * * * *", this.servicesManager.startPoll);

// version 2 => if servicesManager needs its `this` reference
cron.schedule("*/2 * * * *", async () => this.servicesManager.startPoll());

//version 3 ==> using node-schedule
schedule.scheduleJob("*/1 * * * *", async () => this.ServicesManager.startPoll());

我不知道你的 servicesManager ,你可能必须使用上面的“版本 2”才能让它工作。

计划库需要一个函数来执行,但它们在上面的示例中得到了一个已解决的 Promise。

原文由 kraf 发布,翻译遵循 CC BY-SA 4.0 许可协议

计划的异步调用将无法使用 node-cron 至少达到 v3.0.0 ,但我们可以使用 node-schedule ,如下所示。

JS

 schedule.scheduleJob("*/1 * * * *", async () => await this.lifeService.addLife(userId, 1));

TS

 import nodeSchedule = require("node-schedule");

const job: nodeSchedule.Job = nodeSchedule.scheduleJob('*/10 * * * * *', async () => {
    const life = await this.lifeService.getLives(userId);
    console.log(`user's life`, life);
});

原文由 Nathan Getachew 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题