【问题标题】:With socketio is it possible to use async with socket.on使用 socketio 是否可以将异步与 socket.on 一起使用
【发布时间】:2018-04-12 14:42:27
【问题描述】:

是否可以使用 socket io 做类似的事情:

socket.on('event.here', async (data) => {
     const result:any = await webservice();
}

我不太确定该怎么做?

【问题讨论】:

  • 事件已经是异步的...
  • 是的,但是你不能在没有指定异步函数的情况下使用 await
  • 你为什么在事件发生的那一刻调用网络服务?也许你可以解耦这两个过程?
  • 如果你正在使用 Typescript 并获得 eslint @typescript-eslint/no-misused-promises 忽略它。截至今天,socket.io 的类型并不严格正确。 Socket.on() 可以很好地处理 Promise 函数。

标签: node.js typescript socket.io promise


【解决方案1】:

是的,你可以做到,但这取决于你想做什么。如果您希望能够在回调中等待一些异步操作,那么您已经准备就绪。但是,如果您希望在前一个事件的处理完成之前不触发下一个事件,那么它不会那样工作。

这是一个小模拟:

let socket = {
  listeners: [],
  on: function(name, callback) {
    if (!this.listeners[name]) {
      this.listeners[name] = [];
    }
    this.listeners[name].push(callback);
  },
  emit: function(name, data) {
    if (this.listeners[name]) {
        this.callListeners(this.listeners[name], data);
    }
  },
  callListeners: function(listeners, data) {
    listeners.shift()(data);
      if (listeners.length) {
        this.callListeners(listeners, data);
      }
  }
}

function returnsPromise() {
    return new Promise((resolve) => {
    setTimeout(() => {
        resolve();
    }, 1000);
  })
}

socket.on('event.here', async (data) => {
     const result = await returnsPromise();
     console.log('after await');
});

socket.on('event.here', async (data) => {
     const result = await returnsPromise();
     console.log('after await1');
});

socket.emit('event.here', {});

大家可以去玩here感受一下,其实SocketIO跟能不能工作没有关系。

【讨论】:

  • 抱歉提出这个话题。但是你见过这种行为吗?当我们放置 socket.on('event', async(data)=> { ... }) 时,套接字将丢弃用户。我不太确定如何解决这个问题。
猜你喜欢
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2016-04-01
  • 2011-01-20
  • 2018-08-11
  • 2021-08-05
相关资源
最近更新 更多