Как выполнить оконечные точки socket.io синхронно - PullRequest
0 голосов
/ 24 февраля 2019

Мое приложение использует socket.io , насколько я понимаю, socket.io выполняется асинхронно.В большинстве случаев это не проблема, однако есть особый случай, когда 2 пользователя в моем приложении могут одновременно вызывать одну и ту же конечную точку сокета, и это вызывает проблемы.

Я бы предпочел, чтобыдля каждой конечной точки сокета ждать, пока одна из них не завершит выполнение, прежде чем она будет выполнена.Если они работают асинхронно, я получаю неожиданные результаты.

На сервере у меня есть следующее ...

// Establish a connection with a WebSocket.
io.on("connection", socket => {

  socket.on("add_song", async (data) => {
    PlaylistHandler.add_song(io, socket, data);      
  });

...
...

add_song вызывается одновременно двумя разными ioсоединения (2 разных пользователя).Я не хочу, чтобы функция PlaylistHandler.add_song выполнялась параллельно для каждого, поэтому я попытался использовать async / await ...

await PlaylistHandler.add_song(io, socket, data);

Это ничего не решило, потому что я подозреваюэто потому, что есть два разных io соединения, выполняющих вызов.

Есть ли способ заставить сам вызов сокета выполняться последовательно, а не параллельно?

1 Ответ

0 голосов
/ 24 февраля 2019

await не блокирует цикл обработки событий, поэтому здесь это не имеет значения.Оба await PlaylistHandler.add_song будут выполняться параллельно в соответствующих слушателях io.on.

Ваш лучший / самый простой способ - установить переменную calculating = true в начале вашего add_song и отложить любое add_song, если мы уже делаем это.

Надеюсь, этот фрагмент вдохновит вас на достижение работоспособного решения:

let calculating = false;

function add_song(io, socket, data){
    if(calculating){
        setTimeout(function(){
            add_song(io, socket, data)
        }, 500); //depends on how often you want to check, reduce/increase timeout depending on how time-sensitive checking should be       
        return;
    }
    calculating = true;

    //Do all your usual add_song processing

    //After final operation of add_song
    calculating = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...