NodeJS 运行 多个 Node-Schedule 作业中的多个获取请求
NodeJS Running multiple fetch requests inside multiple Node-Schedule jobs
我的目标是能够在每个多节点调度作业中 运行 不同的功能,这将 运行 在一天的特定时间,并根据一天中的时间。
我有以下代码,作为最小示例,我已将其简化。
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);
我可以 运行 这些功能在作业之外很好,或者全部在一个作业中。但不是我在开始时描述的我想要的设置。
第一次迭代工作正常,第二次失败。为了测试目的,每个工作之间的差异是一分钟。
我不确定您在这里做什么,尤其是您对 Promises 的奇怪使用。 (为什么await
Promise.all()
?为什么returnPromise.resolve()
已经解决了response
?为什么await
每个单独的任务而不是让它执行(或失败)异步,相当于一个没有输出的 cronjob 脚本?)
但是,如果这对您的第一次迭代有效,那很好。
我可以假设您使用的是 node-schedule 吗?如果是这样,请注意您实际上使用的是一天中的时间 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);
}
我已经确认这个有效,例如从脚本启动后的那一分钟开始,每分钟发出一个任务。对于您给出的简单示例,await
、then
或 Promise.all
不是必需的,但可能需要,具体取决于您计划如何处理每个工作职能的结果。
我的目标是能够在每个多节点调度作业中 运行 不同的功能,这将 运行 在一天的特定时间,并根据一天中的时间。
我有以下代码,作为最小示例,我已将其简化。
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);
我可以 运行 这些功能在作业之外很好,或者全部在一个作业中。但不是我在开始时描述的我想要的设置。
第一次迭代工作正常,第二次失败。为了测试目的,每个工作之间的差异是一分钟。
我不确定您在这里做什么,尤其是您对 Promises 的奇怪使用。 (为什么await
Promise.all()
?为什么returnPromise.resolve()
已经解决了response
?为什么await
每个单独的任务而不是让它执行(或失败)异步,相当于一个没有输出的 cronjob 脚本?)
但是,如果这对您的第一次迭代有效,那很好。
我可以假设您使用的是 node-schedule 吗?如果是这样,请注意您实际上使用的是一天中的时间 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);
}
我已经确认这个有效,例如从脚本启动后的那一分钟开始,每分钟发出一个任务。对于您给出的简单示例,await
、then
或 Promise.all
不是必需的,但可能需要,具体取决于您计划如何处理每个工作职能的结果。