节点计划的回调中的回调

时间:2019-01-08 10:54:21

标签: javascript node.js scheduled-tasks loopbackjs

在我的(基于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)
    })
  });
};

1 个答案:

答案 0 :(得分:0)

请勿像这样计算所有未清票-这会花费大量资源。

您应该将故障单数量保留在node.js中,并增加/减少它。如果您有多个与数据库交互的进程,请使其中一个成为您的主数据库,并使其处理此任务。


关于您的问题,库node-schedule似乎不支持异步调用。



算法

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

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

,您想发送电子邮件
ticket 1 / 10 min
ticket 2 / 40 min

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

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

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