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

如何修复JavaScript中Audio播放时出现的未捕获Promise异常

报错原因

这个报错由两个问题共同导致:

  • HTMLAudioElement的play()方法本质返回Promise对象,你没有对异常情况做捕获处理,中断类的报错会直接抛到控制台
  • 每次播放前都强制调用load()重新加载音频资源,会直接打断还未完成的play()请求,触发DOM异常,而且音频实例初始化时已经绑定了资源地址,完全不需要每次播放都重复加载
修复方案

基础修复:修改playColor()函数

移除不必要的load()调用,添加Promise异常捕获,即可解决控制台报错,同时保留每次点击从头播放音频的效果:

function playColor(color) {
    // 暂停当前音频并重置播放进度到开头,替代load()实现重头播放的效果
    audio[color].pause();
    audio[color].currentTime = 0;
    // 对play返回的Promise添加catch,捕获播放中断类的异常,不会抛到控制台
    audio[color].play().catch(() => {
        // 无需额外处理的话可以留空,需要调试时再加日志即可
    });
}

进阶优化:避免多个音频重叠播放

如果需要每次点击新的颜色时停止上一个正在播放的音频,可以添加全局变量记录当前播放的实例:

// 全局变量记录当前正在播放的音频实例
let currentPlaying = null;

function playColor(color) {
    // 先停止上一个正在播放的音频
    if (currentPlaying) {
        currentPlaying.pause();
        currentPlaying.currentTime = 0;
    }
    const targetAudio = audio[color];
    currentPlaying = targetAudio;
    targetAudio.play().catch(() => {});
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:15:05