gpt4 book ai didi

javascript - NodeJS : Async comportment not wanted

转载 作者:行者123 更新时间:2023-12-03 12:43:46 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com