回调函数在node-scheduler中不起作用

Rol*_*nez 2 callback scheduler node.js promise

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

我相信这是因为异步行为而发生的事情.如果有的话有办法将此代码转换为承诺吗?我有点迷惑,因为在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);
    });

});
Run Code Online (Sandbox Code Playgroud)

这是电子邮件阅读的代码

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....###`);

    }
Run Code Online (Sandbox Code Playgroud)

更新

这种行为与setInterval功能相同

setInterval(()=>{
email.unreadEmail((msg)=>{...})}, 30000)
Run Code Online (Sandbox Code Playgroud)

Lan*_*ley 5

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

因此,imap.once('ready' ...您应该将计划放在imap.once('ready' ...回调中,而不是放在计划中.我希望以下内容可以确保您imap.once('ready', () => { ...unreadEmail函数中删除.另外,根据您的用例,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);
});
Run Code Online (Sandbox Code Playgroud)