Ожидать socket.on ('answerToRequest') возможно с Socket.io? - PullRequest
0 голосов
/ 18 февраля 2020

Возможно ли как-то следующее?

async function doesSocketAgree(){
    socket.emit('doesOtherSocketAgree', otherSocketId);
    await socket.on('responseDoesSocketAgree', (answer)=>{
      console.log('answer');
});
}

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

В socket.io вы можете использовать обратные вызовы «подтверждений»:

async function doesSocketAgree(){
  await new Promise(resolve => {
    socket.emit('doesOtherSocketAgree', otherSocketId, (answer) => {
      resolve(answer);
    });      
  });
}

https://socket.io/docs/#Sending -и-получение-подтверждения-данных

Таким образом, вы можете использовать один emit() и запускать обратный звонок. Это имеет то преимущество, что вам не нужно иметь дело с утечками памяти при регистрации прослушивателя событий каждый раз, когда вы вызываете эту функцию.

1 голос
/ 18 февраля 2020

Да, но не так. Вы должны будете обернуть эти вещи в обещание, чтобы вы могли «вернуться» из своего await, как только данные поступят как часть вашей обработки «вкл»:

async function doesSocketAgree(){
  socket.emit('doesOtherSocketAgree', otherSocketId);
  await new Promise(resolve => {
    socket.on('responseDoesSocketAgree', answer => {
      resolve(answer);
    });
  });
}

И вы возможно, захочет удалить этого слушателя перед вызовом resolve(), чтобы он не продолжал запускаться, потому что каждый раз, когда вы вызываете doesSocketAgree(), вы добавляете нового слушателя в кучу "on: responseSocketAgree". Так что в конечном итоге все пойдет не так, как надо без очистки.

На этой ноте вы, вероятно, захотите выдать свое "согласен?" со случайным токеном, который может проверить ваш обработчик on, тот, который ограничен текущим вызовом функции, "потому что asyn c".

...