Vue超详细讲解重试机制示例
作者:loyd3 发布时间:2024-04-30 08:45:37
标签: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)
})
// 省略部分代码
}
}
}
来源:https://blog.csdn.net/loyd3/article/details/127787998


猜你喜欢
- 用SQL语句添加删除修改字段 1.增加字段 alter table docdsp add dspcode char(200) 2.删除字段
- 以上是开头,安装完后需要导入转载的代码读取所有docx文件中的内容发现没有读取到表格数据:from docx import Document
- 什么是事件呢?按下键盘某个按键,鼠标移动,包括点击关闭按钮都可以算是事件操作。Pygame事件pygame.event.EventType&
- SQL Server数据库的六个实用技巧:(一)挂起操作在安装Sql或sp补丁的时候系统提示之前有挂起的安装操作,要求重启,这里往往重启无用
- you-get是github上python的一个开源库(https://github.com/soimort/you-get),使用you-
- 函数input()的工作原理函数input()让程序暂停运行,等待用户输入一些文本。获取用户输入后,Python将其存储在一个变量中,以方便
- 什么是目标检测目标检测关注图像 * 定的物体目标,需要同时解决解决定位(localization) + 识别(Recognition)。相比分
- <table border="1" cellpadding="0&quo
- 今天在测试以下代码时遇到该错误:session_start();$_SESSION['username']=$usernam
- 准备工作: ① 首先要会使用ThinkPHP这个框架 ② 最好有些ajax的基础(可以去看下小飞的另外一篇博文:Ajax实时验证"
- 内容摘要: ASP具备管理不同语言脚本程序的能力,能够自动调用合适的脚本引擎以解释脚本代码和执行内置函数。ASP开发环境提供了两种
- 🚩 前言本次实现了一个在浏览器中运行的简陋的人脸检测功能,由于水平有限,这里使用表单上传图片,只能一次检测一张人脸。实现过程中遇到的主要问题
- 测试系统环境 Windows 2003 python 2.5.1
- 一,cookie和session的区别cookie在客户的浏览器上,session存在服务器上cookie是不安全的,且有失效时间sessi
- Python 读取WAV文件import waveimport structfrom scipy import *from pylab im
- 本文实例讲述了go语言map字典删除操作的方法。分享给大家供大家参考。具体分析如下:这里先构造了一点map,添加了青岛、济南、烟台三地的拼音
- iterrows(),iteritems(),itertuples()区别Python函数之iterrows, iteritems, ite
- 一、问题起源 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统
- 关于Markdown在刚才的导语里提到,Markdown 是一种用来写作的轻量级「标记语言」,它用简洁的语法代替排版,而不像一般我们用的字处
- 1. 问题描述输入一个字符串然后对其进行逆序输出第一种方式:字符串切片第二种方式:使用循环转换然后逆序输出比如:输入字符串'hell