我想安排一个异步函数(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
尝试这样的事情
// 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。
计划的异步调用至少在
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);
});
就我而言,我使用的是 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
}
我的Repo.ts:
getUsers() {
return this.myModel.find({});
}
但它不起作用,所以更改了 myService.ts 并尝试了然后:
@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
});
}
来自 https://stackoverflow.com/a/58485606/5816097 的答案已经在版本 1 和 2 中显示,
node-cron
是否可以(至少在 v3+ 版本中)。
这里有一些最小的工作示例(使用“require”语法),可以更好地展示如何使用
async
处理 node-cron
函数。每个计划的 cron 作业每秒都会记录“开始”,并在 300 毫秒后“完成”。
const cron = require('node-cron')
const l = console.log.bind(this)
const wait = ms => new Promise(r => setTimeout(r, ms))
// Version with async function
cron.schedule('* * * * * *', async () => { l('start'); await wait(300); l('finished') })
// Version with normal function and "then"
cron.schedule('* * * * * *', () => { l('start'); wait(300).then(() => l('finished')) })
// Version with function reference
const waitFn = ms => async () => { l('start'); await wait(ms); l('finished') }
cron.schedule('* * * * * *', waitFn(300))