广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue超详细讲解重试机制示例
  • 237
分享到

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

Vue重试机制Vue重试 2023-01-05 18:01:29 237人浏览 独家记忆
摘要

重试指的是当加载出错时,有能力重新发起加载组件的请求。 异步组件加载失败后的重试机制,与请求服务端接口失败后的重试机制一样。所以,先来讨论接口请求失败后的重试机制是如何实现的, 为此

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

异步组件加载失败后的重试机制,与请求服务端接口失败后的重试机制一样。所以,先来讨论接口请求失败后的重试机制是如何实现的, 为此,需要封装一个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重试机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue超详细讲解重试机制示例

本文链接: https://www.lsjlt.com/news/176869.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作