gpt4 book ai didi

node.js - 在事件发射器中使用异步

转载 作者:行者123 更新时间:2023-12-03 12:11:31 25 4
gpt4 key购买 nike

我在尝试在事件内进行异步调用时遇到了挑战。

这是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。

最佳答案

您可以将回调标记为async并在其中使用await

它是event处理程序回调这一事实没有区别,因为最后它只是一个普通的Function

Node 片段

'use strict'

const EventEmitter = require('events')
const myEmitter = new EventEmitter()

const getDogs = () => {
return new Promise(resolve => {
setTimeout(() => {
resolve(['Woof', 'Woof', 'Woof'])
}, 500)
})
}

myEmitter.on('event', async () => {
const dogs = await getDogs()
console.log(dogs)
})

myEmitter.emit('event')

替代方案

如果您仍然无法使用它,可能是因为 transporter.onEventEmitter.on不同-意味着这是 transporter提供的自定义函数。

在内部可以假定提供的回调函数不是 Promise-请记住,将函数标记为 async会强制该函数始终隐式返回 Promise

如果是这种情况,您可能需要将 async函数包装在 IIFE中。
// ..rest of code from above

myEmitter.on('event', () => {
// wrap into an IIFE to make sure that the callback
// itself is not transformed into a Promise
(async function() {
const dogs = await getDogs()
console.log(dogs)
})()
})

myEmitter.emit('event')

关于node.js - 在事件发射器中使用异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47448567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com