Как решить Socket.io на стороне клиента ждать сообщения emit до полного запуска emit? - PullRequest
0 голосов
/ 15 января 2019

Я новичок в технологии socket.io. Я пытаюсь позвонить и синхронно автоматически воспроизвести список аудио, созданный другими людьми. Идеально, когда один триггер испускает. При многократном излучении он воспроизводится асинхронно. Но я хочу назвать это синхронно , иначе все испортится. Не понял, куда мне поставить обратный звонок

Серверная сторона

  socket.on('sound-broadcast', function (message) {

        io.emit('sound-emit', message);

  });

Клиентская сторона

     socket.on('connect', function () {
        window.autoPlay = true;
               socket.on('sound-emit', function (data) {

                    var counter = 1; 

                    data.text.forEach(function(element) {
                        setTimeout(function(){
                            var audio = main_url+element+'.wav';
                            var sound = new Howl({
                                src: [audio]
                            });
                                sound.play();
                                console.log("Counter " +counter);

                            }, counter*2000);
                        counter ++;

                    });

               }); 

    socket.on('disconnect', function () {
        console.log('disconnected');
    });

});

Пример данных {тип: 'голос', текст: ['token_number', 0, 36, 'counter_number', 75]}

Пример данных значение текстовой клавиши - это имя аудиофайла.

1 Ответ

0 голосов
/ 15 января 2019

Я не совсем уверен, что правильно вас понял, но если вы хотите воспроизвести список только один раз за клик, вы можете реализовать это поведение двумя способами:
Первый, создайте флаг, который показывает статус воспроизведения для текущего пользователя.

 // On top of your file
 let playing = false;
 socket.on('connect', function () {
    window.autoPlay = true;

    socket.on('sound-emit', async (data) => {
       // check if player already playing the music
       if (playing) {
         return;
       }

       // Player not playing, so change status for further invocations prevent
       playing = true;

       let counter = 1;

       for (let elem of data.text) {
         await new Promise(resolve => {
           setTimeout(function () {
              const audio = main_url + element + '.wav';
              const sound = new Howl({
                src: [audio],
                onend: function () {
                  console.log('Finished!');
                  counter += 1;
                  resolve();
                },
            });
            sound.play();
          }, counter * 2000);
      });
    }
  })
});

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

...