Javascript 如何解决未捕获(承诺中)的DomeException错误?

Javascript 如何解决未捕获(承诺中)的DomeException错误?,javascript,jquery,promise,html5-video,es6-promise,Javascript,Jquery,Promise,Html5 Video,Es6 Promise,我使用HTML中的两个视频标签来加载当前视频和下一个视频。当当前视频开始播放时,下一个视频将被隐藏并预加载。 当当前视频结束时,它将淡出,下一个视频将淡入。这两个视频标签将以奇偶方式工作,在更改视频源的同时播放即将播放的视频 问题 当用户连续单击以更改视频时,控制台返回一个未捕获的异常错误,它指向更改视频源的代码 该错误可能是由于视频源不断更改,因为在更改视频源之前,该源中已经播放了视频。 另一方面,每次单击都会创建一个视频播放承诺请求,该请求可能会因连续单击而中断,因为请求在解决之前被中断 我

我使用HTML中的两个视频标签来加载当前视频和下一个视频。当当前视频开始播放时,下一个视频将被隐藏并预加载。 当当前视频结束时,它将淡出,下一个视频将淡入。这两个视频标签将以奇偶方式工作,在更改视频源的同时播放即将播放的视频

问题 当用户连续单击以更改视频时,控制台返回一个未捕获的异常错误,它指向更改视频源的代码

该错误可能是由于视频源不断更改,因为在更改视频源之前,该源中已经播放了视频。 另一方面,每次单击都会创建一个视频播放承诺请求,该请求可能会因连续单击而中断,因为请求在解决之前被中断

我试图用空字符串清除这两个视频源,但仍然会生成错误

    // video source is getting changed which interrupts the promise and the error pointer
    oppositeVideoElement.pause();
    $(oppositeVideoElement).fadeOut(800, function () {
        $(oppositeVideoElement).attr('src', nextVideoSource); // line where error points
    });

// Play promise code which gets interrupted before resolve
function playPromiseForMobileVideo(videoElement, videoAboutToPlay) {
    var playPromise = videoElement.play();
    if (playPromise !== undefined) {
        console.log(playPromise);
        playPromise.then(
            function () {
                if (currentDevice == 'mobile' && mobileFirstTime) {
                    videoElement.pause();
                    mobileFirstTime = false;
                }
            }).catch(function (e) {
                if(cameFromNetwork) {
                    videoElement.load();
                    videoElement.play();
                    cameFromNetwork = false;
                    return;
                }
                videoElement.pause();
                $(videoElement).attr('src', videoAboutToPlay);
                videoElement.load();
                videoElement.play();
                console.log('catch video Element', videoElement);
            });
    }
}
预期结果:错误应该被删除,承诺应该被终止


实际结果:生成了阻止当前视频播放的错误。

承诺是一种预期解决或拒绝的结构。当你处理承诺时,你必须同时处理这两者,也就是说,你必须为拒绝创建句柄,就像你必须为解决创建句柄一样

当作为承诺调用方法时,应该始终在末尾添加.catch,catch调用接受回调,该回调将错误作为参数传递

例如:

const method = () => {
  return new Promise((resolve, reject) => {
    reject(new Error({});
  }); 

}

method.then(...).catch(e => console.err(e.message));
如果承诺失败,你必须抓住错误

如果使用async/await,则改用try/catch:


向承诺链添加捕获以捕获错误。@Jite我已经有了捕获块,但代码没有执行或输入捕获块。它只指向更改视频源的代码。
try {
  await method();
} catch (e) {
  console.error(e.message);
}