0

如果我尝试播放一个不存在的音频文件(例如,该文件尚未下载),如下所示:

audio_object = new Audio("Non_Existing_Audio_File.mp3");
audio_object.play();

我得到:

 Uncaught (in promise) DOMException: The media resource indicated by the src attribute or assigned media provider object was not suitable. 

很好,但是我怎样才能发现这个错误呢?如果我尝试/捕获,会发生以下情况:

function playAudioWithTryCatch()   {

            try {               
                audio_object.play();
                 //Result: Uncaught (in promise) DOMException: The media resource indicated by the src attribute or assigned media provider object was not suitable.          
            
            } catch (error) {
                // We never get here:
                console.error("Audio play failed",error);            
            }
            
        }

因此,使用 try/catch 我永远不会到达 catch 块,只有在调用 play 方法时出现相同的未处理错误消息。

如果我尝试使用 Promise,我会得到:

function playAudioWithPromise(){
   
            let myPromise = new Promise(function(resolve, reject) { 

                if (E2.play()) {
                    resolve("OK");
                } else {
                    reject("Error");
                }
            });

            myPromise.then(
                result => console.log(result), 
                error => console.log(error) 
            );
        

            //Result: Uncaught (in promise) DOMException: The media resource indicated by the src attribute or assigned media provider object was not suitable. 
            //And "OK" (console log)

        }

同样,错误没有被捕获,类似于上面。

谁能告诉我如何在此错误输出到控制台之前捕获/处理此错误?

我知道我可以使用 mediareadyState属性,但这在这种情况下无济于事,因为我正在尝试解决一个 Safari 问题,即在用户启动每个音频文件播放方法之前,readyState 不会显示就绪,这是不切实际的,所以我不能在这里使用它。

任何帮助表示赞赏!

4

1 回答 1

1

audio_object.play()本身返回一个承诺。.catch()像正常的承诺一样捕捉错误。我通过测试以下代码并检查浏览器中的变量发现了这一点:

function start() {
    audio_object = new Audio("Non_Existing_Audio_File.mp3");
    window.playResult = audio_object.play();
    playResult.catch(e => {
        window.playResultError = e;
    })
}

start();
于 2022-02-25T16:41:34.730 回答