我正在尝试编写一个小守护程序,检查是否有邮件要发送,如果需要则执行工作,然后休眠 X 秒。
我对NodeJS的异步方式不太熟悉。所以我迷路了。
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...
});
}
正如您所读到的:
- 邮件不会一封接一封地发送
- sleep 真的很冷,所以它也会卡住 sendmail(ARGH)
有人知道谁会意识到这一点吗?
在 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);
最佳答案
如果您要求的是在发送下一封邮件之前完成一封邮件,那么像这样的异步函数可能会解决您的问题:
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
可以帮助您。
旁白 - 以下代码测试调用堆栈大小:
var i = 0;
function a(){
i += 1;
a();
}
a();
在 Node.js v0.10.26 中给出 i = 24275
。
关于javascript - NodeJS : Async comportment not wanted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23415896/