vue中视频加载失败处理以及异常处理方式

14 篇文章 0 订阅


今天为了在vue中为了视频加载失败后显示图片搞了半天,网上说的方法都试过了,但是都无法解决,后来不得不换个方式解决了。因此把几种方式总结一下,最后附上我的解决办法。

1、目的及正常解决方式的代码

当视频加载失败后,用一张图片代替视频,提示用户视频加载失败。下面的是正常的处理方式,但是我在使用过程中却遇到了问题。

<video 
	v-if="videoItem.status===true" 
	class="videoDiv-video" 
	preload="meta" 
	controls="controls" 
	:error="videoLoadError(videoItem)" 
	:src="videoItem.fileUrl" >
</video>
<img v-else src="../../../assets/img/videoErr.png">
videoLoadError (videoItem) {
   videoItem.status = false;
}

2、遇到的问题

因为video加载有可能失败,因为使用videoLoadError方法处理视频加载失败的情况,结果却发现无论视频是否加载成功都会触发error事件对应的videoLoadError方法,后来又换了onload、onemptied等一系列方法,甚至click都试过了,结果发现依然会立刻触发。
源代码。

3、解决方案

3.1、重新设置onerror方法

依然用:error来绑定事件,实际上这里用别的事件,什么click、onload也一样,但是为了可读性和控制台不报错就毅然使用error事件。
先不给video设置src属性(因为之后会重新请求,现在不需要请求,减少向服务器的请求次数),然后给videoItem的fileName值作为每个video的id,并在idvideoLoadError传入videoItem对象,在触发了videoLoadError方法之后,根据id找到对应的video,然后重新设置onerror对应的方法。

<video 
	v-if="videoItem.status===true" 
	class="videoDiv-video" 
	preload="meta" 
	controls="controls" 
	:id="videoItem.fileName"
	:error="videoLoadError(videoItem)">
</video>
<img v-else src="../../../assets/img/videoErr.png">
videoLoadError (videoItem) {
   // 延时再次设置onerror事件
   setTimeout(() => {
     let video = document.getElementById(videoItem.fileName);
     video.onerror = function () { // 这里要用onerror
       videoItem.status = false;
       video.src = videoItem.fileUrl;
       video.onerror = null; // 避免加载失败后陷入死循环
     }
     video.src = videoItem.fileUrl;
   }, 100);
 }

3.2、 prevent修饰符解决

在error事件上后面添加修饰符prevent即可解决,后来又遇到了一个另一个click事件问题,解决后又回过头在这个问题上进行了尝试,也可以解决这个问题。

 <video 
	 v-if="videoItem.status===true" 
	 class="videoDiv-video" 
	 preload="meta" 
	 controls="controls" 
	 :id="videoItem.fileName"
	  v-on:error.prevent="videoLoadError(videoItem)" 
	  :src="videoItem.fileUrl">
</video>
    videoLoadError (videoItem) {
      videoItem.status = false;
    }
Vue ,Promise 对象常常用于处理异步操作。Promise 对象表示一个尚未完成且可能会在将来完成的操作。当 Promise 对象的状态变为 resolved(已解决)时,意味着操作成功完成;当状态变为 rejected(已拒绝)时,意味着操作失败。 在 Vue ,可以使用 Promise 对象来处理异步请求、动态加载组件等。通常情况下,我们使用 axios 库来发送异步请求,axios 库默认返回的就是 Promise 对象,因此可以直接使用 Promise 的 then 和 catch 方法来处理异步请求的响应。 例如: ```javascript axios.get('/api/data') .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); ``` 在以上代码,我们使用 axios 库发送了一个 GET 请求,并且使用 then 和 catch 方法分别处理请求成功和请求失败的情况。当请求成功时,then 方法会被调用并且将响应数据传递给回调函数的 response 参数;当请求失败时,catch 方法会被调用并且将错误信息传递给回调函数error 参数。 除此之外,在 Vue 还可以使用 async/await 等语法糖来简化 Promise 的使用。例如: ```javascript async function getData () { try { const response = await axios.get('/api/data'); console.log(response); } catch (error) { console.log(error); } } ``` 在以上代码,我们使用 async/await 将异步请求转换为同步代码的形式,这样可以使代码更加简洁易读。在 try 块,我们使用 await 关键字等待异步请求的返回结果;如果请求成功,则将响应数据赋值给 response 变量;如果请求失败,则会抛出异常并且进入 catch 块处理错误信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值