12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- import { LIMIT_SERVER } from "@/constants/constants";
- import axios from "axios";
- /** 是否对请求限流 */
- export async function tryLimit({
- action,
- limit = 100,
- }: {
- action: string;
- limit: number;
- }) {
- let res = null;
- let serverPass = false;
- try {
- res = await axios.get(
- `${LIMIT_SERVER}/rate_limit/prod/${action}/${limit}`,
- { timeout: 10 * 1000 }
- );
- serverPass = res.data.pass;
- logger({
- key: "请求限流",
- act: "第一次限流调用",
- dtl: serverPass ? "进入" : "限流",
- ext: { limitAction: action },
- });
- if (!serverPass) {
- // 休眠 1 ~ 5 秒 再试
- res = null; // 供外部判断
- const sleepTime = Math.random() * 4 + 1;
- console.log({ sleepTime, now: Date.now() });
- await new Promise((resolve) => setTimeout(resolve, sleepTime * 1000));
- console.log({ sleepTime, now: Date.now() });
- res = await axios.get(
- `${LIMIT_SERVER}/rate_limit/prod/${action}/${limit}`,
- { timeout: 10 * 1000 }
- );
- serverPass = res.data.pass;
- logger({
- key: "请求限流",
- act: "限流后自动重试",
- dtl: serverPass ? "进入" : "依然限流",
- ext: { limitAction: action },
- });
- }
- } catch (error) {
- console.log(error);
- logger({
- key: "请求限流",
- act: "限流请求失败",
- ejn: JSON.stringify(error),
- ext: { limitAction: action },
- });
- }
- return { limitResult: serverPass, serverOk: !!res };
- }
|