javascript - 节点调度回调中的回调
问题描述
在我的(基于 express.js 的)环回应用程序中,我想安排一个任务每 1 秒运行一次。它应该计算每张打开的票,如果它们已经打开了一段时间,那么应该发送一封电子邮件。下面是一个简化的代码。
问题是,“scheduleJob”已按预期记录,但票数未记录。我认为这是一个上下文问题。我应该如何记录找到的票的号码?我应该如何从count
' 回调与schedule
' 回调通信?
var schedule = require('node-schedule');
module.exports = function(app) {
var Ticket = app.models['Ticket']
var j = schedule.scheduleJob('* * * * * *', function(){
console.log('scheduleJob')
Ticket.count(function(err, count){
if (err) {console.log(err)}
console.log(count)
})
});
};
解决方案
不要这样计算所有的开放票 - 它需要大量资源。
您应该在 node.js 中保留票证的数量并增加/减少它。如果您有多个进程与数据库交互,请将其中一个设为您的主进程并使其处理此任务。
关于您的问题,该库似乎node-schedule
不支持异步调用。
算法
在您的程序开始时,查看数据库中的票证并检索您应该发送电子邮件的下一个时间戳。
例如,如果票证开放 1 小时,您想发送一封电子邮件,并且您的数据库有:
ticket 1 / 10 min
ticket 2 / 40 min
因此,您的下一封邮件应在 20 分钟(60 分钟 - 40 分钟)内发送。
用于setTimeout()
在 20 分钟内唤醒您的节点。当您醒来时,发送邮件,然后再次查看您的数据库以查找下一封要发送的邮件。
重新计算您setTimeout
的数据库中是否插入了新票证或是否删除/更新了票证。
推荐阅读
- java - Jackson XML 序列化:与父级同名的嵌套元素
- python - 在python中使用另一个类中的一个类的用户名
- javascript - 预计 '^169.254$' 在 jasmine 单元测试中为 /^169.254$/
- jquery-ui - 如何创建显示开始日期和结束日期的日期选择器?
- node.js - 在 Angular 8 应用程序中使用 Angular Universal 调试编译错误错误
- c# - 反转列表的特定部分 C#
- algorithm - 评估多项式系数的最佳复杂度
- javascript - 使分页在任何地方都可以在数据表上工作
- sql - 类似于 Postgresql 中的正则表达式
- r - 使用基线使星期几可变二进制