首页 > 解决方案 > 节点调度回调中的回调

问题描述

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

标签: javascriptnode.jsscheduled-tasksloopbackjs

解决方案


不要这样计算所有的开放票 - 它需要大量资源。

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


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



算法

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

例如,如果票证开放 1 小时,您想发送一封电子邮件,并且您的数据库有:

ticket 1 / 10 min
ticket 2 / 40 min

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

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

重新计算您setTimeout的数据库中是否插入了新票证或是否删除/更新了票证。


推荐阅读