【发布时间】:2017-11-23 05:59:43
【问题描述】:
我在尝试在事件中进行异步调用时遇到了挑战。
这是来自Nodemailer 的代码 - 我已经添加了需要进行异步调用的行:
let transporter = nodemailer.createTransport({
SES: new aws.SES({
apiVersion: '2010-12-01'
}),
sendingRate: 1 // max 1 messages/second
});
// Push next messages to Nodemailer
transporter.on('idle', () => {
while (transporter.isIdle()) {
// I need to make an async db call to get the next email in queue
const mail = await getNextFromQueue()
transporter.sendMail(mail);
}
});
我发现了这个post,它建议交换一些东西,这是有道理的,但是我无法正确地应用它。
更新 - 答案是使用 Sinon 模拟 sendMail。
【问题讨论】:
-
你不能把
idle的回调标记为async,然后像往常一样在里面使用await吗? -
这似乎不起作用,因为这是我的第一次尝试。事件不会异步运行。如果你真的认为这应该有效,也许我犯了一个编码错误
-
我已经添加了一个答案 - 但是 - 再想一想,如果你不能让它工作,那可能是因为
transporter.on与 @ 不同987654328@。相反,它可以在内部假设提供的回调函数不是Promise,这或多或少是async关键字的作用。我倾向于相信情况并非如此,但这是一种可能性。如果是这种情况,您可能希望将async包装在 IIFE 中
标签: node.js asynchronous eventemitter