Vue超详细讲解重试机制示例

 更新时间:2023年01月05日 15:18:07   作者:loyd3  
这篇文章主要介绍了Vue重试机制示例,重试指的是当加载出错时,有能力重新发起加载组件的请求。异步组件加载失败后的重试机制,与请求服务端接口失败后的重试机制一样

重试指的是当加载出错时,有能力重新发起加载组件的请求。

异步组件加载失败后的重试机制,与请求服务端接口失败后的重试机制一样。所以,先来讨论接口请求失败后的重试机制是如何实现的, 为此,需要封装一个fetch函数,用来模拟接口请求:

function fetch(){
	return new Promise((resolve,reject) => {
		// 请求会在1秒后失败
		setTimeout(()=>{
			reject('err')
		},1000)
	})
}

为了实现失败后的重试,需要封装一个load函数,如下面代码所示:

// load函数接收一个onError回调函数
function load(onError){
	// 请求接口,得到Promise实例
	const p = fetch()
	// 捕获错误
	return p.catch(err=>{
		// 当错误发生时,返回一个新的Promise实例,并调用onError回调
		// 同时将retry函数作为onError回调的参数
		return new Promise((resolve,reject)=>{
			// retry函数,用来执行重试的函数,执行该函数会重新调用load函数并发送请求
			const retry = () => resolve(load(onError))
			const fail = () => reject(err)
			onError(retry, fail)
		})
	})
}

load函数内部调用fetch函数来发送请求,并得到一个Promise实例,并把该实例的resolve

和reject方法暴露给用户,让用户来决定下一步应该怎么做。这里,将新的Promise实例的resolve和reject分别封装为retry函数和fail函数,并将它们作为onError回调函数的参数。

这样,用户就可以在错误发生时主动选择重试或直接抛出错误。

下面的代码展示了用户时如何进行重试加载的:

// 调用load函数加载资源
load(
	// onError回调
	(retry) => {
		// 失败后重试
		retry()
	}
).then(res=>{
	// 成功
	console.log(res)
})

基于这个原理,就可以很容易地将其整合到异步组件的加载流程中,具体实现如下:

function defineAsyncComponent(options){
	if(typeof options === 'function'){
		options = {
			loader: options
		}
	}
	const {loader} = options
	let InnerComp = null
	// 记录重试次数
	let retries = 0
	// 封装load函数用来加载异步组件
	function load(){
		return loader()
				.catch((err)=>{
					// 如果用户指定了onError回调,则将控制权交给用户
					if(options.onError){
						return new Promise((resolve,reject) => {
							// 重试
							const retry = () => {
								resolve(load())
								retries++
							}
							// 失败
							const fail = () => reject(err)
							// 作为onError回调函数的参数,让用户来决定下一步怎么做
							options.onError(retry, fail, retries)
						})
					}else{
						throw error
					}
				}
	}
	return {
		name: 'AsyncComponentWrapper',
		setup(){
			const loaded = ref(false)
			const error = shallowRef(null)
			const loading = ref(false)
			let loadingTimer = null
			if(options.delay){
				loadingTimer = setTimeout(()=>{
					loading.value = true
				}, options.delay);
			}else{
				loading.value = true
			}
			// 调用load函数加载组件
			load()
				.then(c=>{
					InnerComp = c
					loaded.value = true
				})
				.catch((err)=>{
					err.value = err
				})
				.finally(()=>{
					loading.value = false
					clearTimeout(loadingTimer)
				})
			// 省略部分代码
		}
	}
}

到此这篇关于Vue超详细讲解重试机制示例的文章就介绍到这了,更多相关Vue重试机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue2.x版本中computed和watch的使用及关联和区别

    vue2.x版本中computed和watch的使用及关联和区别

    这篇文章主要介绍了vue2.x版本中computed和watch的使用及关联和区别,文章围绕主题展开详细的内容介绍,需要的小伙伴可以参考一下
    2022-07-07
  • vue easytable组件使用详解

    vue easytable组件使用详解

    Vue Easytable是一个基于Vue.js的数据表格组件库,它提供丰富的功能和灵活的配置,帮助开发者快速搭建复杂的数据表格界面,这篇文章主要介绍了vue easytable组件使用,需要的朋友可以参考下
    2023-09-09
  • 三步搞定:Vue.js调用Android原生操作

    三步搞定:Vue.js调用Android原生操作

    这篇文章主要介绍了三步搞定:Vue.js调用Android原生操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Vue echarts绘制甘特图的示例代码

    Vue echarts绘制甘特图的示例代码

    甘特图是一种条状图,直观展示项目进展随时间的走势及联系,其中,项目时间由横轴表示,项目活动由纵轴表示,本文给大家介绍了Vue echarts绘制甘特图的实现方法,并有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-03-03
  • 解决vue router使用 history 模式刷新后404问题

    解决vue router使用 history 模式刷新后404问题

    这篇文章主要介绍了解决vue router使用 history 模式刷新后404问题,需要的朋友可以参考下
    2017-07-07
  • Vue实现图书管理小案例

    Vue实现图书管理小案例

    这篇文章主要为大家详细介绍了Vue实现图书管理小案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • vue项目中实现图片预览的公用组件功能

    vue项目中实现图片预览的公用组件功能

    小编接到查看影像的功能需求,根据需求,多个组件需要用到查看影像的功能,所以考虑做一个公用组件,通过组件传值的方法将查看影像文件的入参传过去。下面小编通过实例代码给大家分享vue项目中实现图片预览的公用组件功能,需要的朋友参考下吧
    2018-10-10
  • 深入浅析Vue不同场景下组件间的数据交流

    深入浅析Vue不同场景下组件间的数据交流

    探通过本篇文章给大家探讨不同场景下组件间的数据“交流”的Vue实现方法,感兴趣的朋友一起看看吧
    2017-08-08
  • Vue.js实现动画与过渡效果的示例代码

    Vue.js实现动画与过渡效果的示例代码

    在现代前端开发中,用户体验至关重要,一个精美的动画过渡不仅能提升界面的美观性,还能让用户在使用时感受到流畅的交互体验,在本文中,我们将深入探讨如何在 Vue.js 中实现动画与过渡效果,并提供示例代码,需要的朋友可以参考下
    2024-10-10
  • vue项目实战总结篇

    vue项目实战总结篇

    离放假还有1天,今天小编抽空给大家分享前端时间小编做的vue项目,非常完整,需要的朋友参考下
    2018-02-02

最新评论