繁体   English   中英

节点计划的回调中的回调

[英]callback in node-schedule's callback

在我的(基于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不支持异步调用。



算法

在程序开始时,查看数据库中的票证,并在应该发送电子邮件时检索下一个时间戳。

例如,如果要打开一张票并且您的数据库有:

ticket 1 / 10 min
ticket 2 / 40 min

因此,您的下一封邮件应在20分钟(60分钟-40分钟)内发送。

使用setTimeout()在20分钟内唤醒您的节点。 唤醒后,发送邮件,然后再次查看数据库以查找下一封要发送的邮件。

如果数据库中插入了新的票证,或者已删除/更新了票证,请重新计算setTimeout

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM