При разработке радиоприёмника столснулся с проблемой в google chrome. Именно в chrome, что самое поразительное, в остальных браузерах всё работает прекрасно. В chrome происходят 2 неведомых бага. Один явный, другой непонятно откуда взявшийся и даже нагуглить его не выходит.
Сначала про приёмник:
radiotune.concord-media.ru
В нём есть переключалки станций - всего их около 20. Работает он на плагине buzz.js (сначала хотел сделать нативно через audio src, но потом начал копаться на stackoverflow, когда обнаружил в хроме первый баг с кэшированием звука).
Баг №1:
Он явный и загуглить его можно было. В консоль выпадала ошибка, а проигрывание прекращалось.
Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause().
Я нашёл багрепорт. Что странно - он закрыт, но судя по всему в официальном обновлении фикс не выкатили, ибо хром я обновлял пару недель назад, а ветка закрыта уже как с 8 месяцев. На stackoverflow предлагают костыли, типа setTimeout. Не знаю как остальные ставили на это галки - лично мне не помогло. Скорее всего потому что в src у меня потоковые ссылки и с ними всё не так просто. Сталкивался ли кто-то с этим багом на практике? Как боролись?
Баг №2:
Выше уже упоминал. Chrome зараза кэширует проигранный звук. Как результат после перемотки на ту же станцию он начинает проигрывать то, что уже закэшировал при первом воспроизведении. Как отключить эту хрень я так и не понял. Когда пробовал делать нативными методами (до установки buzz.js) я удалял в алгоритме переключения src, потом возвращал обратно, на audio повесил preload none, пробовал current time на ноль скидывать и не скидывать. Ничего не помогает.
Вообщем, очень я разочарован в google chrome. Видимо, flash ещё актуален из за подобных косяков, казалось бы, самой крутой IT-компании мира.
UPD
Коллега из backend подсказал подкрутить к событию promise. Я с промисами не работал и как-то хз как это сделать, может подскажет кто?
Собственно событие в нынешнем виде:
var i = 0;
switchStationBtn.click(function(){
soundsGroup[i].pause();
if(i === (stations.ids.length - 1)){
i = 0;
}else{
i += 1;
}
});
switchBtn.click(function(){
if(soundsGroup[i].isPaused()){
soundsGroup[i].play();
}else{
soundsGroup[i].pause();
}
});
Как мне в такую конструкцию впилить промис, чтоб он обрабатывал ошибку и даже при ошибке выдавал play()