node.js - NodeJS 在多个 Node-Schedule 作业中运行多个 fetch 请求
问题描述
我的目标是能够在每个多节点调度作业中运行不同的功能,这些作业将在一天中的特定时间运行,并根据一天中的时间调用特定的功能。
我有以下代码,作为一个最小的例子,我已经让它变得简单了。
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
?为什么每个单独的任务而不是让它异步执行(或失败)相当于一个没有输出的 cronjob 脚本?)Promise.all()
Promise.resolve()
response
await
但是,如果这对您的第一次迭代有效,那很好。
我可以假设您正在使用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
对于您给出的简单示例是必需的,但根据您计划如何处理每个工作职能的结果,可能需要。
推荐阅读
- mongodb - 有没有办法在一个查询MongoDB中跳过不同的查找过滤器输出
- apache - 让我们用 Docker 加密证书
- ruby-on-rails - Rails:对来自循环数组的值
- javascript - 除非事件处理程序完成执行,否则反应会阻止重新渲染吗?
- c++ - c ++如何将右值引用传递给另一个函数
- python - 从python获取符号链接路径
- javascript - format.js 中的 Rails 5 未知格式错误
- php - 按一个列值对行进行分组,对另一列求和并计算出现次数
- javascript - 尝试编写 Fluid App 用户脚本以禁用概念侧边栏自动弹出行为
- python - (psycopg2.ProgrammingError) 无法适应“箭头”类型