LaterJS中的多个setTimeouts不按计划进行

时间:2018-08-23 08:45:01

标签: javascript node.js settimeout laterjs

我在NodeJS中有一个电子邮件数据库服务器,可以在以下时间范围内发送预定的电子邮件。

Email 1: Immediately
Email 2: 3 days after email 1
Email 3: 7 days after email 1

但是,当向应用程序中提交多个条目时,它会中断计划,以随机方式逐步执行setTimeouts。

以下是安排电子邮件的相关代码

server.post('/api/addUser', (req, res) => {

  MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    var dbo = db.db("heroku_XXXXXXXX");
    var myobj = { recruiter: req.body.recruiter, firstName: req.body.firstName, lastName: req.body.lastName, profile: req.body.profile, email: req.body.email, emailStep: 'Step 1', emailsCancelled: 'No', source: req.body.source, company: req.body.company, role: req.body.role };
    dbo.collection("users").insertOne(myobj, function(err, data) {
      if (err) throw err;
      res.status(200).send('success');
      db.close();
      sendMail(myobj,req.body.emailOne, "Step 1");
      var sched = later.parse.recur().every(72).hour(),
        t = later.setTimeout(function() { sendMail(myobj,req.body.emailTwo, "Step 2"); }, sched);
      var sched2 = later.parse.recur().every(168).hour(),
          u = later.setTimeout(function() { sendMail(myobj,req.body.emailThree, "Step 3"); }, sched2);
    });
  });
});

电子邮件发送得很好,它们正被传递到SendGrid,好吧,只是调度变得混乱了。我试过删除LaterJS并仅使用setTimeouts,但这也不起作用。

1 个答案:

答案 0 :(得分:1)

我不会这么长时间依赖setTimeout。我不确定node / v8中setTimeout的实现细节,但是无论执行什么操作,计算机时钟都会偏移,虚拟机也将暂停/恢复。

相反,定义一个任务列表,每隔几分钟运行一次较小的函数检查时间,并在有必要执行任何任务时运行。您也可以使用crontab等调用应用程序来发送电子邮件。这样,您还可以确保重新启动此服务会很好。

此外,我建议稍微清理一下代码。通过定义一些变量,可以在每个函数调用之外移动内容?