javascript - NodeJS : Async comportment not wanted

标签 javascript node.js asynchronous

我正在尝试编写一个小守护程序,检查是否有邮件要发送,如果需要则执行工作,然后休眠 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...
        });

    }

正如您所读到的:

  1. 邮件不会一封接一封地发送
  2. 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 函数封装了 getMailToSendsendMail,它们相互调用。请注意,当前的 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/

相关文章:

java - 通过拆分和运行将 ListenableFuture<Iterable<A>> 转换为 Iterable<ListenableFuture<B>>

node.js - 在 serverless yml 中添加角色作为 CloudFormation 模板

javascript - 无法以管理员身份从后端对 cognito 进行身份验证

javascript - 2/4 Angular handle 资源下载

node.js - 如何在没有文件写入权限的情况下收集一个可能包含它自己的异步调用的方法?

javascript - Backbone.js 为什么我必须使用下划线 (_.each) 来定位模型?

javascript - 无限缩放强制布局d3.js

javascript - 如何使用javascript强制关闭android键盘

javascript - jQuery 通过类名获取 ID

javascript - jQuery:如何让 ajaxSend 在继续之前等待另一个 Ajax 响应?