Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS 8.x:EventEmitter+;异步/等待_Javascript_Node.js_Async Await_Eventemitter - Fatal编程技术网

Javascript NodeJS 8.x:EventEmitter+;异步/等待

Javascript NodeJS 8.x:EventEmitter+;异步/等待,javascript,node.js,async-await,eventemitter,Javascript,Node.js,Async Await,Eventemitter,如何将异步函数与事件发射器一起使用,在其他信息源中说:不要将异步函数与事件发射器一起使用。 我基本上希望将异步函数与事件发射器混合使用,以便它解析并显示消息 代码如下: server.on('published', async (packet, client) => { // event emitter with async function debug(`Received: ${packet.topic}`) switch (packet.topic) { case '

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

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

代码如下:

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是新来的,我没有发现类似的东西


标题中有一个类似的问题,但与此问题无关。

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

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);

另一方面,使用sync函数,您知道,侦听器将按顺序调用(下一个将在前一个结束时启动)。使用异步监听器,下一个监听器将在当前监听器中的第一个
wait
之后立即启动。在event emmiter中使用异步函数的主要问题是无法处理由此产生的承诺拒绝。所以你可以这样做:

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);

另一方面,使用sync函数,您知道,侦听器将按顺序调用(下一个将在前一个结束时启动)。使用异步监听器,下一个监听器将在当前监听器中的第一个
wait
之后立即启动。您对此无能为力。

代码有效吗?如果没有,请描述您遇到的问题,因为“它不起作用”不是vlaid问题描述,“在其他信息源中说”-它在哪里说的,您可以链接这些吗?另外,为什么您不相信它们呢?是的,您可以在任何地方使用
async
函数作为回调函数。但是,事件发射器不会从中获得任何好处,它只会将返回的承诺扔掉。@JaromandaX不,我的代码不工作,基本上我的问题与此线程有关,不理解答案。代码工作吗?如果没有,请描述您遇到的问题,因为“它不起作用”不是vlaid问题描述,“在其他信息源中说”-它在哪里说的,您可以链接这些吗?另外,为什么您不相信它们呢?是的,您可以在任何地方使用
async
函数作为回调函数。但是,事件发射器不会从中获得任何好处,它只会将返回的承诺扔掉。@JaromandaX不,我的代码不起作用,基本上是一个与此线程相关的问题,无法理解答案。不,这不是
async
函数的问题。所有发射器回调都不能抛出,您只需处理所有错误。无论是使用包装器函数还是使用函数本身内部的
try
/
catch
都没有什么区别。不,这不是
async
函数的问题。所有发射器回调都不能抛出,您只需处理所有错误。无论您是使用包装函数还是使用函数本身内部的
try
/
catch
来实现这一点,都没有什么区别。