committed by
GitHub
1 changed files with 69 additions and 4 deletions
@ -1,13 +1,78 @@ |
|||
<template> |
|||
<div class="m-10"> |
|||
<a-button @click="handleClick" type="primary"> 点击会重新发起请求5次 </a-button> |
|||
<p class="mt-4">打开浏览器的network面板,可以看到发出了六次请求</p> |
|||
</div> |
|||
<PageWrapper title="错误重试"> |
|||
<Row :gutter="16"> |
|||
<Col :span="8"> |
|||
<Card title="Axios 错误重试"> |
|||
<a-button @click="handleClick" type="primary"> 点击会重新发起请求5次 </a-button> |
|||
<div class="mt-4">打开浏览器的 network 面板,可以看到发出了六次请求</div> |
|||
</Card> |
|||
</Col> |
|||
<Col :span="8"> |
|||
<Card title="hooks 错误重试"> |
|||
<Space> |
|||
<a-button @click="restRun" type="primary" :disabled="loading"> |
|||
使用 hooks 发起重试 |
|||
</a-button> |
|||
<a-button @click="restCancel">取消</a-button> |
|||
</Space> |
|||
<div class="mt-4" |
|||
>错误重试,retryInterval 如果不设置,默认采用简易的指数退避算法,取 1000 * 2 ** |
|||
retryCount,也就是第一次重试等待 2s,第二次重试等待 4s,以此类推,如果大于 30s,则取 30s |
|||
</div> |
|||
</Card> |
|||
</Col> |
|||
</Row> |
|||
</PageWrapper> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { PageWrapper } from '@/components/Page'; |
|||
import { useRequest } from '@vben/hooks'; |
|||
import { testRetry } from '@/api/sys/user'; |
|||
import { Card, Col, Row, Space, message } from 'ant-design-vue'; |
|||
|
|||
// @ts-ignore |
|||
const handleClick = async () => { |
|||
await testRetry(); |
|||
}; |
|||
|
|||
function apiError() { |
|||
return new Promise<void>((resolve, reject) => { |
|||
setTimeout(() => { |
|||
reject(`TimeError: ${Date.now()}`); |
|||
}, 1300); |
|||
}); |
|||
} |
|||
|
|||
// PS >> useRequest 代替不了API(如: axios),但它使得开发更灵活 |
|||
|
|||
// 使得重试不再局限于 API 请求,兼容扩展和继续封装 |
|||
// 继续封装,如:useRequest 第一个参数,可以嵌套多个异步函数 |
|||
// 兼容扩展,如:同时启用防抖、节流、loading状态、取消异步等功能 |
|||
|
|||
// eg. 仅仅为了计数,restRun、restCancel 其实都可省略 |
|||
let i = 0; |
|||
const { loading, run, cancel } = useRequest(apiError, { |
|||
manual: true, |
|||
retryCount: 5, |
|||
// retryInterval: undefined, // 重试时间间隔,单位为毫秒 |
|||
onError(error) { |
|||
if (i === 0) { |
|||
message.error(`发现错误`); |
|||
i++; |
|||
} |
|||
const now = Date.now(); |
|||
message.error(`第 ${i++} 次重试, Time:${now}`); |
|||
console.log(`Time: ${now}, Error: ${error}`); |
|||
}, |
|||
}); |
|||
const restRun = () => { |
|||
i = 0; |
|||
run(); |
|||
}; |
|||
const restCancel = () => { |
|||
i = 0; |
|||
cancel(); |
|||
message.info('已取消'); |
|||
}; |
|||
</script> |
|||
|
|||
Loading…
Reference in new issue