С socketio можно использовать асинхронность с socket.on

Можно ли сделать что-то подобное с socket io :

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

Я не совсем уверен, как это сделать?


person An-droid    schedule 31.10.2017    source источник
comment
События уже асинхронны...   -  person Kokodoko    schedule 31.10.2017
comment
да, но вы не можете использовать ожидание без указания асинхронности в функции   -  person An-droid    schedule 31.10.2017
comment
Почему вы звоните в веб-службу в тот момент, когда происходит событие? Возможно, вы могли бы разделить эти два процесса?   -  person Kokodoko    schedule 31.10.2017
comment
Если вы используете Typescript и получаете eslint @typescript-eslint/no-misused-promises, просто игнорируйте его. На сегодняшний день типы для socket.io не совсем корректны. Socket.on() прекрасно справляется с функцией Promise‹void›.   -  person Robert    schedule 10.06.2020


Ответы (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', {});

Вы можете поиграть с ним здесь, чтобы почувствовать, на самом деле SocketIO не имеет ничего общего с его способностью работать.

person guramidev    schedule 31.10.2017
comment
Извините, что поднимаю эту тему. Но вы видели поведение этого? Когда мы помещаем socket.on('event', async(data)=› { ... }) сокеты удалят пользователя. Я не совсем уверен, как я могу это решить. - person xsephtion; 09.10.2020