HTMLMediaElement.play() ส่งคืนคำมั่นสัญญา

การเล่นเสียงและวิดีโอบนเว็บโดยอัตโนมัติเป็นความสามารถที่มีประสิทธิภาพ และอยู่ภายใต้ข้อจำกัดที่แตกต่างกันในแพลตฟอร์มต่างๆ ปัจจุบันเบราว์เซอร์ในเดสก์ท็อปส่วนใหญ่จะอนุญาตให้หน้าเว็บเริ่มเล่น <video> หรือ <audio> ผ่าน JavaScript โดยไม่ต้องมีการโต้ตอบของผู้ใช้ อย่างไรก็ตาม เบราว์เซอร์บนอุปกรณ์เคลื่อนที่ส่วนใหญ่จำเป็นต้องใช้ท่าทางสัมผัสของผู้ใช้อย่างชัดแจ้งก่อนที่การเล่นที่เริ่มต้น JavaScript จะเกิดขึ้นได้ วิธีนี้จะช่วยให้มั่นใจได้ว่าผู้ใช้อุปกรณ์เคลื่อนที่ ซึ่งหลายคนจ่ายค่าแบนด์วิดท์หรืออยู่ในสภาพแวดล้อมสาธารณะ อย่าเริ่มดาวน์โหลดและเล่นสื่อโดยไม่ได้ตั้งใจโดยไม่โต้ตอบกับหน้าเว็บอย่างชัดเจน

ที่ผ่านมานั้นการระบุได้ยากว่าจำเป็นต้องมีการโต้ตอบของผู้ใช้หรือไม่เพื่อเริ่มเล่น และการตรวจหาข้อผิดพลาดที่เกิดขึ้นเมื่อพยายามเล่น (อัตโนมัติ) และล้มเหลว มีวิธีแก้ปัญหาหลายอย่าง แต่ก็ไม่มีประโยชน์มากนัก การปรับปรุงเมธอด play() ที่ระบุเพื่อรับมือกับความไม่แน่นอนนี้เกินเวลาไปมากแล้ว และตอนนี้การเปลี่ยนแปลงนี้ก็นำมาซึ่งแพลตฟอร์มเว็บโดยได้ติดตั้งใช้งานใน Chrome 50 เป็นครั้งแรก

ตอนนี้การเรียก play() ในองค์ประกอบ <video> หรือ <audio> จะแสดงผลเป็น Promise ถ้าเล่นสำเร็จ การเล่นสำเร็จ คำสัญญาจะสำเร็จ และหากเล่นไม่สำเร็จ ระบบจะปฏิเสธ Promise พร้อมกับข้อความแสดงข้อผิดพลาดที่อธิบายความล้มเหลว วิธีนี้จะช่วยให้คุณเขียนโค้ดที่ใช้งานง่ายได้ดังตัวอย่างต่อไปนี้

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.
    });
}

นอกจากการตรวจหาว่าเมธอด play() สําเร็จหรือไม่แล้ว อินเทอร์เฟซแบบ Promise แบบใหม่ยังช่วยให้คุณระบุเวลาที่เมธอด play() สําเร็จได้ด้วย เว็บเบราว์เซอร์อาจตัดสินใจเลื่อนเวลาเริ่มเล่นออกไปจากบางสถานการณ์ เช่น Chrome ในเดสก์ท็อปจะไม่เริ่มเล่น <video> จนกว่าแท็บจะปรากฏขึ้นมา Promise จะไม่ทำงานต่อไปจนกว่าการเล่นจะเริ่มเล่นจริงๆ ซึ่งหมายความว่าโค้ดใน then() จะไม่ทํางานจนกว่าสื่อจะเล่น วิธีการก่อนหน้านี้ในการพิจารณาว่า play() สําเร็จหรือไม่ เช่น การรอระยะเวลาหนึ่งสําหรับเหตุการณ์ playing และถือว่าล้มเหลวหากไม่เริ่มทำงาน อาจมีแนวโน้มที่จะทำให้เกิดผลลบลวงในสถานการณ์การเล่นแบบล่าช้า

เราได้เผยแพร่ตัวอย่างที่เผยแพร่อยู่ ของฟังก์ชันใหม่นี้ ดูในเบราว์เซอร์ เช่น Chrome 50 ที่รองรับอินเทอร์เฟซแบบ Promise โปรดทราบว่าหน้าเว็บจะเล่นเพลงโดยอัตโนมัติเมื่อคุณเข้าชม (แน่นอนว่ามันไม่ได้เป็นเช่นนั้น)

โซนอันตราย

<source> ใน <video> ทำให้ play() สัญญาได้เลยว่าจะไม่ถูกปฏิเสธ

สำหรับ <video src="not-existing-video.mp4"\> คำมั่นสัญญา play() จะปฏิเสธตามที่คาดไว้เนื่องจากไม่มีวิดีโออยู่ สำหรับ <video><source src="not-existing-video.mp4" type='video/mp4'></video> สัญญาของ play() จะไม่ปฏิเสธเด็ดขาด ซึ่งจะเกิดขึ้นเฉพาะในกรณีที่ไม่มีแหล่งที่มาที่ถูกต้องเท่านั้น

ข้อบกพร่อง Chromium