Javascript 使用异步/等待功能通过Imap检索电子邮件
当我尝试使用下面的代码(使用异步函数)通过imap检索电子邮件时,我得到以下控制台输出/错误: 收件箱:未定义 /Users/mainuser/node_modules/imap/lib/Connection.js:432 cb(错误,自我保护盒); ^ 类型错误:cb不是一个函数Javascript 使用异步/等待功能通过Imap检索电子邮件,javascript,node.js,async-await,Javascript,Node.js,Async Await,当我尝试使用下面的代码(使用异步函数)通过imap检索电子邮件时,我得到以下控制台输出/错误: 收件箱:未定义 /Users/mainuser/node_modules/imap/lib/Connection.js:432 cb(错误,自我保护盒); ^ 类型错误:cb不是一个函数 var Imap = require('imap'); var inspect = require('util').inspect; var imap = new Imap({ user: 'mymailnam
var Imap = require('imap');
var inspect = require('util').inspect;
var imap = new Imap({
user: 'mymailname@mail.com',
password: 'mymailpassword',
host: 'imap.mail.com',
port: 993,
tls: true
});
const openInbox = async () => {
try {
const inbox = await imap.openBox('INBOX', true)
return inbox
}catch(error){
console.log("Error: "+ error)
}
}
imap.once('ready', () => {
console.log('ready')
openInbox()
.then(inbox => console.log('Inbox: ' + inbox))
});
imap.connect()
但是,我可以打开收件箱并使用嵌套回调输出收件箱对象,如下所示:
imap.once('ready', () => {
imap.openBox('INBOX', true, (err, inbox) => {
console.log('Inbox: ' + inbox)
});
});
imap.connect()
如果您喜欢使用Promissions,您应该围绕
imap.openBox
编写一个自定义包装,或者使用Node.js内置函数包装它:
const Imap = require('imap');
const promisify = require('util').promisify;
const imap = new Imap({
user: 'mymailname@mail.com',
password: 'mymailpassword',
host: 'imap.mail.com',
port: 993,
tls: true
});
const openBox = promisify(imap.openBox.bind(imap));
imap.once('ready', () => {
console.log('ready')
openBox('INBOX', true)
.then(inbox => console.log(inbox))
.catch(err => {
console.log(err)
})
});
imap.connect()
为了简化整个API,请尝试将imap实例包装到中。注意:推荐的方法具有Async
前缀:
const bluebird = require('bluebird');
const Imap = require('imap');
const imap = bluebird.promisifyAll(new Imap({
user: 'mymailname@mail.com',
password: 'mymailpassword',
host: 'imap.mail.com',
port: 993,
tls: true
}));
imap.once('ready', () => {
console.log('ready')
imap.openBoxAsync('INBOX', true)
.then(inbox => console.log(inbox))
.catch(err => {
console.log(err)
})
});
imap.connect()
谢谢我希望我可以使用Asyn/WAIT函数。尽管如此,这让我更接近解决方案。在我通过这样做promisify imap.openbox之后:const openbox=promisify(imap.openbox.bind(imap));我现在能够成功地记录收件箱对象。现在唯一的问题是:我如何承诺整个imap API?您好@LoupG,您可以尝试使用Bluebird.promisifyAll来承诺整个API。我已经更新了答案,在对你的答案做出评论之前,我已经尝试过了,我想我应该这么说。你试过了吗?如果它对你有用,你能把代码作为答案的一部分吗。提前谢谢是的,它对我有用。我已经将利用
bluebird.promisifyAll
的代码添加到了答案中。非常感谢,我没有意识到promisify库将我的promisify添加到方法名称后重命名了方法!显然,imap
库不支持Promise您是对的,它不支持。我只是想找个办法现在就去图书馆,有什么想法吗?我试过使用蓝鸟promisifyall,没有骰子。你可以在下面的答案下看到评论。ThanksUpdate:imap simple library于2020年4月发布。它有内置的承诺,IMO使异步函数更简单。