HTMLMediaElement.play() zwraca obietnicę.

Automatyczne odtwarzanie dźwięku i obrazu w internecie to potężna funkcja, która podlega różnym ograniczeniom na różnych platformach. Obecnie większość przeglądarek komputerowych zawsze zezwala na rozpoczęcie odtwarzania<video> lub <audio> za pomocą JavaScriptu bez interakcji użytkownika. Większość przeglądarek mobilnych wymaga jednak wyraźnego działania użytkownika, aby rozpocząć odtwarzanie inicjowane przez JavaScript. Dzięki temu użytkownicy mobilni, z których wielu płaci za przepustowość lub może przebywać w miejscu publicznym, nie będą przypadkowo rozpoczynać pobierania i odtwarzania multimediów bez wyraźnego wchodzenia w interakcję ze stroną.

Do tej pory trudno było określić, czy do rozpoczęcia odtwarzania wymagana jest interakcja użytkownika, oraz wykryć błędy występujące podczas próby odtworzenia (automatycznego) i jego niepowodzenia. Istnieją różne workarounds, ale nie są one idealne. Ulepszenie metody play(), które pozwoliłoby rozwiązać ten problem, od dawna było potrzebne. Wprowadziliśmy je na platformę internetową, a pierwsze wdrożenie pojawiło się w Chrome 50.

Wywołanie play() elementu <video> lub <audio> zwraca teraz obietnice. Jeśli odtwarzanie się powiedzie, obietnica zostanie spełniona, a jeśli nie, zostanie odrzucona wraz z komunikatem o błędzie wyjaśniającym przyczynę. Dzięki temu możesz pisać intuicyjny kod, np. taki:

var playPromise = document.querySelector('video').play();

// In browsers that don’t yet support this functionality,
// playPromise won’t be defined.
if (playPromise !== undefined) {
    playPromise.then(function() {
    // Automatic playback started!
    }).catch(function(error) {
    // Automatic playback failed.
    // Show a UI element to let the user manually start playback.
    });
}

Oprócz wykrywania, czy metoda play() się powiodła, nowy interfejs oparty na obietnicach pozwala określić, kiedy metoda play() się powiodła. W niektórych kontekstach przeglądarka internetowa może opóźnić rozpoczęcie odtwarzania. Na przykład w Chrome na komputery odtwarzanie <video> rozpocznie się dopiero wtedy, gdy karta będzie widoczna. Obietnica nie zostanie spełniona, dopóki odtwarzanie nie zostanie faktycznie rozpoczęte, co oznacza, że kod w then() nie zostanie wykonany, dopóki nie rozpocznie się odtwarzanie multimediów. Wcześniejsze metody określania, czy zdarzenie play() zakończyło się powodzeniem, takie jak oczekiwanie przez określony czas na zdarzenie playing i przyjmowanie, że jeśli nie zadziała, to oznacza niepowodzenie, są podatne na fałszywie wyniki w sytuacjach opóźnionego odtwarzania.

Opublikowaliśmy przykład praktycznego zastosowania tej nowej funkcji. Otwórz go w przeglądarce, takiej jak Chrome 50, która obsługuje ten interfejs oparty na obietnicy. Uwaga: gdy ją otworzysz, muzyka zacznie się automatycznie odtwarzać. (chyba że oczywiście nie).

Strefa zagrożenia

<source><video> powoduje, że play() promise nigdy nie odrzuca

W przypadku <video src="not-existing-video.mp4"\> play() obiecuje odrzucić zgłoszenie, ponieważ film nie istnieje. W przypadku <video><source src="not-existing-video.mp4" type='video/mp4'></video> play() nigdy nie odrzuca obietnicy. Dzieje się tak tylko wtedy, gdy nie ma prawidłowych źródeł.

Błąd w Chromium