You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中等待音频播放完毕后再执行后续操作?

解决音频播放完成后更新状态的问题

你的判断没错,audio.play()是异步操作,它会立即返回而不会等待音频播放完成,所以后续的状态更新代码会直接执行。要实现“先显示播放中,等待音频结束后显示完成”的效果,可以通过以下两种方式实现:

方法一:监听ended事件

利用音频元素的ended事件,当音频播放完成时触发状态更新:

const audio = new Audio('{{ path }}');
const statusElement = document.getElementById("audio-status");

// 先设置播放状态
statusElement.textContent = "Playing the audio";

// 尝试播放音频,处理可能的播放失败
audio.play().catch(error => {
  statusElement.textContent = "Failed to play audio";
  console.error(error);
});

// 监听音频播放结束事件
audio.addEventListener('ended', () => {
  statusElement.textContent = "done playing the audio";
});

说明:

  • 直接使用audio元素的play方法,无需额外封装函数
  • 监听ended事件,确保只有音频播放完成后才更新状态
  • 加上catch处理播放失败场景(比如浏览器自动阻止音频播放、文件加载失败等)

方法二:使用async/await结合Promise

通过async/await语法让代码逻辑更线性,同时等待音频播放完成:

const audio = new Audio('{{ path }}');
const statusElement = document.getElementById("audio-status");

async function playAndWait() {
  statusElement.textContent = "Playing the audio";
  try {
    // 等待音频开始播放
    await audio.play();
    // 等待音频播放结束
    await new Promise(resolve => {
      audio.addEventListener('ended', resolve, { once: true });
    });
    // 播放完成后更新状态
    statusElement.textContent = "done playing the audio";
  } catch (error) {
    statusElement.textContent = "Failed to play audio";
    console.error(error);
  }
}

// 注意:多数浏览器要求音频播放触发自用户交互(比如点击),否则会被阻止
// 建议将playAndWait绑定到按钮点击等用户操作上
document.querySelector('#play-button')?.addEventListener('click', playAndWait);

说明:

  • audio.play()返回一个Promise,会在音频开始播放时resolve
  • 通过创建新的Promise监听ended事件,确保等待到播放完成
  • { once: true }配置让事件只触发一次,避免内存泄漏
  • 注意浏览器的自动播放策略:音频播放通常需要用户交互触发,否则会被浏览器阻止

内容的提问来源于stack exchange,提问作者Ved Rathi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:48:18