NodeJS:不需要Async comportment

时间:2014-05-01 20:19:47

标签: javascript node.js asynchronous

我试图写一个小守护进程来检查是否有邮件要发送,如果需要就做一些工作,然后睡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...
        });

    }

您可以阅读:

  1. 邮件不会在一个
  2. 之后发送
  3. 睡眠真的很冷,所以它也冻结了sendmail(ARGH)
  4. 有人知道是谁意识到了这一点吗?

    首次解决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);
    

1 个答案:

答案 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函数封装了getMailToSendsendMail,它们相互调用。请注意,当前的JavaScript有一个限制,可以经历这个循环次数,直到你的调用堆栈变得太大,这是堆栈溢出!

最后,编写这种异步代码很容易出现程序员错误。我强烈建议您选择一个库来为您完成。一个受欢迎的(我赞成)是async,但有很多可供选择。在上述情况下,async.whilst可以为您提供帮助。

Aside - 以下代码测试调用堆栈大小:

var i = 0;

function a(){
    i += 1;
    a();
}

a();

在Node.js v0.10.26中提供i = 24275