【问题标题】:callback function not working in node-scheduler回调函数在节点调度程序中不起作用
【发布时间】:2018-11-28 08:35:17
【问题描述】:

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

我相信这是由于异步行为而发生的。如果是这样,有没有办法将此代码转换为承诺?我有点困惑,因为 imap 接口中有多个 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)

【问题讨论】:

  • 您可以尝试在logger.info(reading unread emails....###); 下方调用回调并检查它是否正常工作?
  • @planet_hunter 然后就可以了
  • 在里面放一个try catch,看看是否有异常发生

标签: node.js callback promise scheduler


【解决方案1】:

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

因此,不应将imap.once('ready' ... 放在日程表中,而应将日程表放在imap.once('ready' ... 回调中。我希望类似以下的操作确保您从unreadEmail 函数中删除imap.once('ready', () => { ...。此外,根据您的用例,setInterval 可能是比 node-schedule 更好的选择:

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);
});

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多