Vue超詳細講解重試機制示例
重試指的是當加載出錯時,有能力重新發(fā)起加載組件的請求。
異步組件加載失敗后的重試機制,與請求服務(wù)端接口失敗后的重試機制一樣。所以,先來討論接口請求失敗后的重試機制是如何實現(xiàn)的, 為此,需要封裝一個fetch函數(shù),用來模擬接口請求:
function fetch(){
return new Promise((resolve,reject) => {
// 請求會在1秒后失敗
setTimeout(()=>{
reject('err')
},1000)
})
}
為了實現(xiàn)失敗后的重試,需要封裝一個load函數(shù),如下面代碼所示:
// load函數(shù)接收一個onError回調(diào)函數(shù)
function load(onError){
// 請求接口,得到Promise實例
const p = fetch()
// 捕獲錯誤
return p.catch(err=>{
// 當錯誤發(fā)生時,返回一個新的Promise實例,并調(diào)用onError回調(diào)
// 同時將retry函數(shù)作為onError回調(diào)的參數(shù)
return new Promise((resolve,reject)=>{
// retry函數(shù),用來執(zhí)行重試的函數(shù),執(zhí)行該函數(shù)會重新調(diào)用load函數(shù)并發(fā)送請求
const retry = () => resolve(load(onError))
const fail = () => reject(err)
onError(retry, fail)
})
})
}
load函數(shù)內(nèi)部調(diào)用fetch函數(shù)來發(fā)送請求,并得到一個Promise實例,并把該實例的resolve
和reject方法暴露給用戶,讓用戶來決定下一步應(yīng)該怎么做。這里,將新的Promise實例的resolve和reject分別封裝為retry函數(shù)和fail函數(shù),并將它們作為onError回調(diào)函數(shù)的參數(shù)。
這樣,用戶就可以在錯誤發(fā)生時主動選擇重試或直接拋出錯誤。
下面的代碼展示了用戶時如何進行重試加載的:
// 調(diào)用load函數(shù)加載資源
load(
// onError回調(diào)
(retry) => {
// 失敗后重試
retry()
}
).then(res=>{
// 成功
console.log(res)
})
基于這個原理,就可以很容易地將其整合到異步組件的加載流程中,具體實現(xiàn)如下:
function defineAsyncComponent(options){
if(typeof options === 'function'){
options = {
loader: options
}
}
const {loader} = options
let InnerComp = null
// 記錄重試次數(shù)
let retries = 0
// 封裝load函數(shù)用來加載異步組件
function load(){
return loader()
.catch((err)=>{
// 如果用戶指定了onError回調(diào),則將控制權(quán)交給用戶
if(options.onError){
return new Promise((resolve,reject) => {
// 重試
const retry = () => {
resolve(load())
retries++
}
// 失敗
const fail = () => reject(err)
// 作為onError回調(diào)函數(shù)的參數(shù),讓用戶來決定下一步怎么做
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
}
// 調(diào)用load函數(shù)加載組件
load()
.then(c=>{
InnerComp = c
loaded.value = true
})
.catch((err)=>{
err.value = err
})
.finally(()=>{
loading.value = false
clearTimeout(loadingTimer)
})
// 省略部分代碼
}
}
}
到此這篇關(guān)于Vue超詳細講解重試機制示例的文章就介紹到這了,更多相關(guān)Vue重試機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue點擊按鈕跳轉(zhuǎn)到另一個vue頁面實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于vue點擊按鈕跳轉(zhuǎn)到另一個vue頁面的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
Vue.js結(jié)合Ueditor富文本編輯器的實例代碼
本篇文章主要介紹了Vue.js結(jié)合Ueditor的項目實例代碼,這里整理了詳細的代碼,具有一定的參考價值,有興趣的可以了解一下2017-07-07
Vue項目添加前綴,ngnix發(fā)布相關(guān)修改問題
這篇文章主要介紹了Vue項目添加前綴,ngnix發(fā)布相關(guān)修改問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
vue使用html2canvas和jspdf將html轉(zhuǎn)成pdf
在前端開發(fā)中, html轉(zhuǎn)pdf是最常見的需求,下面這篇文章主要給大家介紹了關(guān)于vue如何使用html2canvas和jspdf將html轉(zhuǎn)成pdf的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-03-03
Vue+Element實現(xiàn)網(wǎng)頁版?zhèn)€人簡歷系統(tǒng)(推薦)
這篇文章主要介紹了Vue+Element實現(xiàn)網(wǎng)頁版?zhèn)€人簡歷系統(tǒng),需要的朋友可以參考下2019-12-12
Vue項目npm操作npm run serve或npm run dev報錯及二者
這篇文章主要介紹了Vue項目npm操作npm run serve或npm run dev報錯及二者的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10

