Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   audio, узнать когда возможно проиграть (https://javascript.ru/forum/misc/83018-audio-uznat-kogda-vozmozhno-proigrat.html)

od0201 27.08.2021 20:23

audio, узнать когда возможно проиграть
 
задача, Нужно узнать когда возможно проиграть аудио

когда .catch все срабатывает
когда .then ничего не выводит. в .finally не заходит и console.log('end') не выводит
когда в .then делал clearTimeout тоже ничего не выводило, хотя setInterval прерывало

<body>
</body>
<script>let audio= document.createElement('audio')
  let timerId = setTimeout(async function tick() {
    console.log('begin')
    let a=-1
    await audio.play()
      .then((e)=>{
        console.log('ok')
        a=0
      })
      .catch((error) => {
        timerId = setTimeout(tick, 2500)
        console.log(`play failed because the user didn't interact with the document first`)
        a=1
      })
      .finally(()=>console.log(a))
    console.log('end')
  }, 2500);</script>

Aetae 28.08.2021 00:01

Всё срабатывает и выводит:
showhtml:5 begin
showhtml:14 play failed because the user didn't interact with the document first // catch
showhtml:17 1 // finnaly
showhtml:18 end

А играть не будет никогда - потому, почему написано. Запуск play должен быть результатом клика и никак иначе. Либо хотябы одно аудео\видео хоть раз за время сеанса должно было быть запущено в результате клика.

od0201 28.08.2021 12:13

Давайте детальнее.

1 состояние, когда пользователь не взаимодействует со страницей, то срабатывает .catch() и я уведомляю пользователя о том что он должен выполнить какое-то действие на странице. И это работает !!!!

2 состояние, когда пользователь уже взаимодействовал со станицей, то дожно срабатывать .then(e), где я хочу уведомлять пользователя "все ок, сигнал будет" и здесь есть проблема, все что я делаю в этом блоке, оно не отображается. Также в данном состоянии в .finally() код не срабатывает. Но стоить заметить, что в этом состоянии можно прервать цикл, если использовать setInterval/clearTimeout

od0201 28.08.2021 13:10

проблема была в том, что код заходит в .then() после окончания проигрывания. Задали audio.src и все стало на свои места
<body>
</body>
<script>
let audio= document.createElement('audio')
audio.src='https://mp3melodii.ru/files_site_02/001/standartnyj_signal_sms_iphone.mp3'
let timerId=setInterval(() => {
  let isPlay=false
  audio.play()
    .then(()=>{console.log('проигрывает');clearInterval(timerId)})
    .catch(() => console.log('не проигрывает'))
}, 2000);
</script>


Часовой пояс GMT +3, время: 03:47.