gpt4 book ai didi

node.js - 回调函数在 Node 调度程序中不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 00:19:53 24 4
gpt4 key购买 nike

我已经使用 node.js 成功编写了一段代码来读取我电子邮箱中看不见的电子邮件。当我在普通的 javascript 文件中运行它时,它工作正常。现在我想安排脚本每 30 秒运行一次。所以使用 node-scheduler 编写了一个代码片段,如下所示。运行这个我只是得到 reading unread emails....### 作为输出,console.log(msg); 不打印任何东西。如果我在没有 nod-scheduler 的情况下运行它,它工作正常。可能是什么问题?我用 email.unreadEmail 函数尝试了 await 关键字,它也没有用。

我相信这是由于异步行为而发生的事情。如果是这样,有没有办法将此代码转换为 promise ?我有点困惑,因为 imap 接口(interface)中有多个 nexted 回调。

schedule.scheduleJob('*/30 * * * * *', () => {

logger.info(`scheduler runs at ${new Date()} for check unread emails`);
let email = new mail.default();
email.unreadEmail((msg) => {
console.log(msg);
});

});

这是阅读邮件的代码

unreadEmail(callback){

logger.info(`reading unread emails....###`);

imap.once('ready', () => {

openIncidents((err, box) => {
if (err) throw err;
imap.search([ 'UNSEEN'], (err, results) => {
if (err) throw err;

try{
// var f = imap.fetch(results, { bodies: '',markSeen: true });
var f = imap.fetch(results, { bodies: '' });
f.on('message', (msg, seqno) => {
console.log('Message #%d', seqno);
var prefix = '(#' + seqno + ') ';
msg.on('body', (stream, info) => {

simpleParser(stream, (err, mail) => {

callback(mail.subject);

});

// stream.pipe(fs.createWriteStream('msg-' + seqno + '-body.txt'));
});
msg.once('attributes', function(attrs) {
logger.info(prefix + 'Attributes: %s', inspect(attrs, false, 8));
});
msg.once('end', function() {
logger.info(prefix + 'Finished');
});
});
f.once('error', function(err) {
logger.error('Fetch error: ' + err);
});
f.once('end', function() {
logger.info('Done fetching all messages!');
imap.end();
});
}catch (e) {
logger.error('Error from fetching mails, probably there are no unseen emails in mailbox');
}

});
});
});

logger.info(`end of the email function....###`);

}

已更新

此行为与setInterval 函数相同

setInterval(()=>{
email.unreadEmail((msg)=>{...})}, 30000)

最佳答案

假设您正在使用 imap NPM 模块(您没有在原始问题中指定),新 imap 连接的 'ready' 事件只会触发验证一次(请在此处查看 _login 的代码:https://github.com/mscdex/node-imap/blob/master/lib/Connection.js#L1604)。

因此,与其将 imap.once('ready' ... 放在日程表中,不如将日程表放在 imap.once('ready' ... 回调。我希望像下面这样的东西能够确保你从 中删除 imap.once('ready', () => { ... >unreadEmail 函数。此外,根据您的用例,与 Node 计划相比,setInterval 可能是更好的选择:

imap.once('ready', () => {
setInterval(() => {

logger.info(`scheduler runs at ${new Date()} for check unread emails`);
let email = new mail.default();
email.unreadEmail((msg) => {
console.log(msg);
});

}, 30000);
});

关于node.js - 回调函数在 Node 调度程序中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50927394/

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