NodeJS 在多个节点计划作业中运行多个获取请求



我的目标是能够在每个多节点计划作业中运行不同的函数,这些作业将在一天中的特定时间运行,并根据一天中的时间调用特定函数。

我有以下代码,对于最小示例,我使它变得简单。

var f1 = function () {
return fetch('url1.php', {
method: 'post',
headers: {
'Content-Type': 'application/json'
}
})
}
var f2 = function () {
return fetch('url2.php', {
method: 'post',
headers: {
'Content-Type': 'application/json'
}
})
}
var tasks = [f1, f2];
const promesas = async(tasks) => {
return await Promise.all(tasks.map(function (e, j) {
rules[j] = new schedule.RecurrenceRule();
rules[j].dayOfWeek = [new schedule.Range(1, 5)];
rules[j].hour = hours[j];
rules[j].minute = mins[j];
return schedule.scheduleJob(rules[j], async function () {
try {
await tasks[j]()

} catch (error) {
console.log(error);
}
});
})).then(response => {
return Promise.resolve(response);
});
}
promesas(tasks);

我可以在作业之外运行这些功能,也可以在单个作业中运行所有这些函数。但不是在我想要的设置中,我在开始时描述。

第一次迭代工作正常,第二次迭代失败。出于测试目的,每个作业之间的差异为一分钟。

我不确定你在这里做什么,尤其是你对承诺的奇怪使用。(为什么要awaitPromise.all()?为什么要返回已解决responsePromise.resolve()?为什么要await每个单独的任务,而不是让它异步执行(或失败),这相当于没有输出的 cronjob 脚本?

但是,如果这对您第一次迭代有用,那很好.
我可以假设您使用的是节点计划吗?如果是这样,请注意,您实际上是在一天中的 00:00、01:01 等时间,而不是您声称的"出于测试目的,每个时间之间间隔一分钟"。

以下是我将如何做您似乎正在尝试做的事情:


const tasks = [f1, f2];
let i = 0;
for (let task of tasks) {
let rule = new schedule.RecurrenceRule();
rule.dayOfWeek = [new schedule.Range(1, 5)];
rule.minute = (new Date().getMinutes() + (++i)) % 60; // adjust to suit your needs
schedule.scheduleJob(rule, task);
}

我已经确认这是有效的,例如,从脚本启动后的一分钟开始,每分钟发布一个任务。对于您给出的简单示例,不需要awaitthenPromise.all,但可能需要,具体取决于您计划如何处理每个工作职能的结果。

最新更新