回调函数在节点调度程序中不起作用
callback function not working in node-scheduler
我已经使用 node.js 成功地编写了一个代码来读取我电子邮箱中看不见的电子邮件。当我在正常的 javascript 文件中 运行 它工作正常。现在我想将脚本安排为每 30 秒 运行。所以使用 node-scheduler 编写了一个代码片段,如下所示。 运行宁我只是得到 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)
假设您正在使用 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', () => { ...
。此外,根据您的用例,与 node-schedule:
相比,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 成功地编写了一个代码来读取我电子邮箱中看不见的电子邮件。当我在正常的 javascript 文件中 运行 它工作正常。现在我想将脚本安排为每 30 秒 运行。所以使用 node-scheduler 编写了一个代码片段,如下所示。 运行宁我只是得到 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)
假设您正在使用 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', () => { ...
。此外,根据您的用例,与 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);
});