【问题标题】:NodeJS 8.x: EventEmitter + async/awaitNodeJS 8.x:EventEmitter + async/await
【发布时间】:2017-12-13 03:37:26
【问题描述】:

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

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

代码如下:

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中的类似问题,但与本问题无关。

【问题讨论】:

  • 代码有效吗?如果不是,请描述您遇到的问题,因为“它不起作用”不是一个空洞的问题描述
  • 在其他信息来源中说” - 它在哪里说,你能链接那些吗?还有,你为什么不相信他们?
  • 是的,您可以在任何地方使用async 函数作为回调。但是,事件发射器不会从中获得任何收益,它只会将返回的 Promise 扔掉。
  • @JaromandaX 不,我的代码不起作用,基本上我的问题与这个线程github.com/mcollina/mosca/issues/711 相关,但不明白答案。

标签: javascript node.js async-await eventemitter


【解决方案1】:

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

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 之后立即启动。你对此无能为力。

【讨论】:

  • 不,这不是 async 函数的问题。 All 发射器回调不能抛出,你只需要处理所有错误。无论您是使用包装函数还是在函数本身内部使用 try/catch 都没有区别。
猜你喜欢
  • 2018-02-28
  • 2021-06-15
  • 1970-01-01
  • 2018-10-13
  • 2016-10-15
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多