node.js延迟发送邮件

我正在做一个简单的事情,但这是行不通的。

我想要做的是发送邮件延迟30秒。

代码如下:

user.forEach(function(data) { var locals = { fname: data.Name, your_name: data.From, } template.render(locals, function(err, results) { if (err) { return console.error(err) } else { transporter.sendMail({ to: data.Email, subject: "Welcome", replyTo: data.ReplyTo, html: results.html, text: results.text, }, function(error, info) { console.log("here"); if (error) { console.log(error); } else { console.log('Message sent: ' + info.response); }; }); } }); }); 

这里的用户是一个对象的数组,详细信息如Email,from,Name等

数组中的每个对象都有要发送的特定邮件的详细信息。

我想发一封邮件,然后等待30秒,然后发送第二个邮件,然后等待。

我用setInterval和npm睡眠,但是这是行不通的。 它等待30秒,然后发送所有的邮件一次。

您应该用asynchronous实现replaceforEach syncronous。
选项1。 使用async.js eachLimit并以30秒的延迟呼叫回叫
选项2。 你可以为你的发送邮件函数写封装,如:

 var emails = ['email1', 'email2' /*...*/]; function sendEmailAndWait(email, callback){ // your stuff transporter.sendMail(email, function(error, info) { // handle results if(!emails.length) return callback(); setTimeout(function () { sendEmailAndWait(emails.shift(), callback); }, 30*1000) }) } sendEmailAndWait(emails.shift(), function(){ /* allDone */}); 
  setTimeout(function() { template.render(locals, function(err, results) { if (err) { return console.error(err) } else { transporter.sendMail({ to: data.Email, subject: "Welcome", replyTo: data.ReplyTo, html: results.html, text: results.text, }, function(error, info) { console.log("here"); if (error) { console.log(error); } else { console.log('Message sent: ' + info.response); }; }); } }); }, 3000);