使用socketio可以使用socket同步异步。

时间:2017-10-31 12:18:59

标签: node.js typescript socket.io promise

是否可以使用socket io执行类似的操作:

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

我不太确定该怎么做?

1 个答案:

答案 0 :(得分:4)

是的,你可以做到,但这取决于你想做什么。如果你想能够在回调中等待一些异步操作而不是你所有的设置。但是如果你想让下一个事件在前一个事件的处理完成之前没有开火,那么它就不会那样工作。

这是一个小模拟:

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与它的工作无关。