当前位置: 首页 > article >正文

前端并发多个请求并失败重发

 const MAX_RETRIES = 3;

// 模拟请求
function makeRequest(url) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      Math.random() < 0.75 ? resolve(`${url} 成功`) : reject(`${url} 失败`); // 随机决定请求是否成功
    }, Math.random() * 2000); // 随机延时执行
  });
}

const requestStateMachine = {
  idle: {
    MAKE_REQUEST: 'pending',
  },
  pending: {
    SUCCESS: 'resolved',
    FAILURE: 'retrying',
  },
  retrying: {
    SUCCESS: 'resolved',
    FAILURE: 'failed',
  },
  resolved: {},
  failed: {},
};

function reducer(state, action) {
  const nextState = requestStateMachine[state.currentState][action.type];

  if (!nextState) {
    return state;
  }

  return {
    currentState: nextState,
    retries: action.type === 'FAILURE' ? state.retries + 1 : 0,
  };
}

async function processRequest(url, dispatch) {
  if (state.retries < MAX_RETRIES) {
    try {
      const response = await makeRequest(url);
      dispatch({ type: 'SUCCESS' }); // 请求成功

      return response;
    } catch (err) {
      dispatch({ type: 'FAILURE' }); // 请求失败
      return processRequest(url, dispatch); // 自动重试
    }
  } else {
    dispatch({ type: 'FAILURE' }); // 过多的失败
    throw new Error('Request failed after maximum retries');
  }
}

const urls = ['urlA', 'urlB', 'urlC'];
const successes = [];
const failures = [];

Promise.allSettled(
  urls.map(async (url) => {
    let state = {
      currentState: 'idle',
      retries: 0,
    };

    const dispatch = (action) => {
      state = reducer(state, action);
    };

    try {
      const response = await processRequest(url, dispatch);
      successes.push(response);
    } catch (err) {
      failures.push(err.message);
    }
  })
).then(() => {
  console.log("成功列表:", successes);
  console.log("失败列表:", failures);
});

MAX_RETRIES常量设置每个请求允许的最大重试次数。

makeRequest函数模拟一个请求,返回一个Promise,在随机延迟后以随机概率解析或拒绝。

requestStateMachine对象定义了请求处理过程的可能状态和转换。

reducer函数接受当前状态和一个动作作为参数,并根据动作和状态机定义返回下一个状态。

processRequest函数是一个异步函数,它接受一个URL和一个dispatch函数作为参数。它通过调用makeRequest来处理请求,并根据请求的成功或失败派发动作。如果请求失败且重试次数小于最大重试次数(MAX_RETRIES),则会递归调用processRequest进行自动重试。

urls数组包含要进行请求的URL列表。

successes数组用于存储成功的响应结果。

failures数组用于存储失败的请求的错误信息。

使用Promise.allSettled和map方法对每个URL进行请求处理,并将结果存储在相应的数组中。

最后,通过then方法在所有请求处理完成后打印成功列表和失败列表。

这段代码的作用是并行地处理多个异步请求,并在请求失败时自动进行重试,直到达到最大重试次数。成功的响应结果存储在successes数组中,失败的请求的错误信息存储在failures数组中。


http://www.kler.cn/a/159636.html

相关文章:

  • 【数据结构】AVL树
  • 论文 | The Capacity for Moral Self-Correction in LargeLanguage Models
  • 批量从Excel某一列中找到符合要求的值并提取其对应数据
  • 2分钟在阿里云ECS控制台部署个人应用(图文示例)
  • 火车车厢重排问题,C++详解
  • 硬件工程师之电子元器件—二极管(4)之热量对二极管温度特性的影响
  • Opencv框选黑色字体进行替换(涉及知识点:selectROI,在控制台输入字体大小,颜色,内容替换所选择的区域)
  • ORACLE使用Mybatis-plus批量插入
  • vue select选择下拉组织树,解决不出现横向滚动条
  • C#用MathNet生成矩阵,并打印矩阵元素
  • 智能优化算法应用:基于冠状病毒群体免疫算法无线传感器网络(WSN)覆盖优化 - 附代码
  • Python list tuple dict set的文件持久操作
  • acwing算法基础之时空复杂度分析
  • MFC对话框集成OSG无法响应键盘事件
  • 使用Pytorch从零开始实现BERT
  • python爬虫-某公开数据网站实例小记
  • vue中el-upload结合vuedraggable实现图片的上传、排序、删除以及预览等功能
  • 2023-12-01 AndroidR 系统在root目录下新建文件夹和创建链接,编译的时候需要修改sepolicy权限
  • 创建腾讯云存储桶---上传图片--使用cos-sdk完成上传
  • 简介Kadane算法及相关的普通动态规划
  • RepidJson将内容格式化后写入文件
  • 【OpenSSH升级】升级后证书认证登录突然失效
  • C语言能判断一个变量是int还是float吗?
  • 若依框架 前台自己获取登录用户信息
  • 矩阵处理—转圈打印矩阵
  • HomeAssistant如何添加HACS插件实现公网控制米家与HomeKit等智能家居