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>
|
Всё срабатывает и выводит:
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 должен быть результатом клика и никак иначе. Либо хотябы одно аудео\видео хоть раз за время сеанса должно было быть запущено в результате клика. |
Давайте детальнее.
1 состояние, когда пользователь не взаимодействует со страницей, то срабатывает .catch() и я уведомляю пользователя о том что он должен выполнить какое-то действие на странице. И это работает !!!! 2 состояние, когда пользователь уже взаимодействовал со станицей, то дожно срабатывать .then(e), где я хочу уведомлять пользователя "все ок, сигнал будет" и здесь есть проблема, все что я делаю в этом блоке, оно не отображается. Также в данном состоянии в .finally() код не срабатывает. Но стоить заметить, что в этом состоянии можно прервать цикл, если использовать setInterval/clearTimeout |
проблема была в том, что код заходит в .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, время: 10:21. |