我试图写一个小守护进程来检查是否有邮件要发送,如果需要就做一些工作,然后睡X秒。
我对NodeJS的asynchrone方式不太熟悉。所以我迷路了。
var sleep = require('sleep');
function getMailToSend(callback){
[...]
}
function sendmail(mail, callback) {
[...]
}
while(true){
sleep.sleep(10);
getMailToSend(function(err, mail) {
if(err) //Do log, whatever
sendMail(mail, function(err, response) {
if(err) //Do log...
});
}
您可以阅读:
有人知道是谁意识到了这一点吗?
首次解决qubyte后编辑
我有一个解决方案,但是很好的一个:s
var obj = { sent: true};
setInterval(function () {
if(obj.sent === false){
return;
}
obj.sent = false;
getMailToSend(function(err, mail) {
sendMail(function(err, response){
obj.sent = true;
});
});
}, 10000);
答案 0 :(得分:1)
如果您要求的是在发送下一封邮件之前完成一封邮件,那么像这样的async函数可以解决您的问题:
function handleMail (callback) {
function getMailToSend() {
// Logic to get mail.
// No mail left to process.
if (!mail) {
return callback();
}
sendMail(mail);
}
function sendMail(mail) {
// Logic to send the mail.
getMailToSend();
}
// Get the get-send cycle started.
getMailToSend();
}
请注意handleMail
函数封装了getMailToSend
和sendMail
,它们相互调用。请注意,当前的JavaScript有一个限制,可以经历这个循环次数,直到你的调用堆栈变得太大,这是堆栈溢出!
最后,编写这种异步代码很容易出现程序员错误。我强烈建议您选择一个库来为您完成。一个受欢迎的(我赞成)是async,但有很多可供选择。在上述情况下,async.whilst
可以为您提供帮助。
Aside - 以下代码测试调用堆栈大小:
var i = 0;
function a(){
i += 1;
a();
}
a();
在Node.js v0.10.26中提供i = 24275
。