gpt4 book ai didi

javascript - Node 8.x : EventEmitter + async/await

转载 作者:行者123 更新时间:2023-11-30 06:51:09 24 4
gpt4 key购买 nike

我如何将异步函数与事件发射器一起使用,在其他信息来源中说:不要将异步函数与事件发射器一起使用。

我基本上想将异步函数与事件发射器混合,以便它解析和事件发射器显示消息。

代码如下:

server.on('published', async (packet, client) => { // event emitter with async function
debug(`Received: ${packet.topic}`)

switch (packet.topic) {
case 'agent/connected':
case 'agent/disconnected':
debug(`Payload: ${packet.payload}`)
break
case 'agent/message':
debug(`Payload: ${packet.payload}`)

const payload = parsePayload(packet.payload)

if (payload) {
payload.agent.connected = true

let agent
try {
agent = await Agent.createOrUpdate(payload.agent)
} catch (e) {
return handleError(e)
}
debug(`Agent ${agent.uuid} saved`)

// Notify Agent is Connected
if (!clients.get(client.id)) {
clients.set(client.id, agent)
server.publish({
topic: 'agent/connected',
payload: JSON.stringify({
agent: {
uuid: agent.uuid,
name: agent.name,
hostname: agent.hostname,
pid: agent.pid,
connected: agent.connected
}
})
})
}

// Store Metrics
for (let metric of payload.metrics) {
let m

try {
m = await Metric.create(agent.uuid, metric)
} catch (e) {
return handleError(e)
}

debug(`Metric ${m.id} saved on agent ${agent.uuid}`)
}
}
break
}
})

如果这个问题已经在某处完成,我想道歉。我是 nodejs 的新手,但我没有发现类似的东西。

标题中的类似问题NodeJS 7: EventEmitter + await/async但与本题无关。

最佳答案

在事件发射器中使用异步函数的主要问题是您无法处理由此产生的 promise 拒绝。所以你可以这样做:

const asyncEventHandler = async function(...args) { /* do anything here */ };
const eventHandlerWrapper = function(...args) {
const promise = asyncEventHandler(...args);
promise.catch(function(error) {
// handle error here
});
};

emitter.on("some-event", eventHandlerWrapper);

另一方面 - 使用同步功能,您知道,监听器将按顺序调用(下一个在前一个结束时开始)。对于异步监听器,下一个监听器将在当前监听器中的第一个 await 之后立即开始。您对此无能为力。

关于javascript - Node 8.x : EventEmitter + async/await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47785109/

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