我想安排一个异步(异步/等待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(" star/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
答案 0 :(得分: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。
答案 1 :(得分:0)
就我而言,我使用的是 async/await 函数,例如:
myService.ts :
@Cron(CronExpression.EVERY_10_SECONDS)
async myExample() {
const todaysDate: dayjs.Dayjs = dayjs();
Logger.log(`Cron started at ${todaysDate}`);
const users = await this.myRepo.getUsers();
// code here
}
myRepo.ts :
getUsers() {
return this.myModel.find({});
}
但它不起作用所以改变了 myService.ts 并尝试了 then :
@Cron(CronExpression.EVERY_10_SECONDS)
async myExample() {
const todaysDate: dayjs.Dayjs = dayjs();
Logger.log(`Cron started at ${todaysDate}`);
this.myRepo.getUsers().then(users => {
// code here
});
}