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

react页面定时器调用一组多个接口,如果接口请求返回令牌失效,清除定时器不再触发这一组请求

        为了实现一个React页面使用定时器调用一组多个接口,并在任意一个接口请求返回令牌失效时清除定时器且不再触发这一组请求,可以遵循以下步骤:

        1. 定义API调用函数:创建一个函数来处理一组API调用。每个API调用都应该检查响应状态以确定令牌是否有效。
        2. 设置定时器:使用useEffect钩子和setInterval来设置定时器,该定时器会定期调用上述API调用函数。
        3. 错误处理:在API调用中加入错误处理逻辑,特别是针对401未授权的状态码(通常意味着令牌已失效)。
        4. 清理定时器:当检测到令牌失效时,清除定时器并停止进一步的API调用。
        下面是一个更加具体的代码示例,它展示了如何在React组件中实现这些步骤:

import React, { useEffect, useState } from 'react';

function MyComponent() {
  // 定义API端点和访问令牌
  const apiEndpoints = [
    'https://api.example.com/endpoint1',
    'https://api.example.com/endpoint2',
    'https://api.example.com/endpoint3',
    'https://api.example.com/endpoint4',
    'https://api.example.com/endpoint5'
  ];
  const [accessToken, setAccessToken] = useState('YOUR_ACCESS_TOKEN'); // 确保安全处理令牌

  // 定义一个状态变量用于保存定时器ID
  const [intervalId, setIntervalId] = useState(null);

  const fetchDataGroup = async () => {
    try {
      await Promise.all(apiEndpoints.map(async (endpoint) => {
        const response = await fetch(endpoint, {
          headers: {
            Authorization: `Bearer ${accessToken}`
          }
        });

        if (!response.ok) {
          if (response.status === 401) {
            throw new Error('Token expired');
          } else {
            throw new Error(`HTTP error! status: ${response.status}`);
          }
        }

        // 处理成功的响应...
        const data = await response.json();
        console.log(data);
      }));
    } catch (error) {
      console.error('Error fetching data:', error.message);
      if (error.message === 'Token expired') {
        handleTokenInvalid();
      }
    }
  };

  const handleTokenInvalid = () => {
    console.log('Access token is invalid, stopping further requests.');
    clearInterval(intervalId); // 清除定时器
    // 可能需要在这里做更多处理,比如刷新令牌或让用户重新登录
  };

  useEffect(() => {
    // 设置定时器,开始周期性地调用API
    const id = setInterval(fetchDataGroup, 10000); // 每10秒
    setIntervalId(id);

    // 第一次渲染时立即获取数据
    fetchDataGroup();

    // 组件卸载时清理定时器
    return () => clearInterval(id);
  }, []); // 空数组确保仅在首次渲染时运行

  return (
    <div>
      {/* 组件UI */}
    </div>
  );
}

export default MyComponent;

        在这个例子中,fetchDataGroup 函数会发起一组API请求,并使用Promise.all等待所有请求完成。如果任何一个请求失败并且状态码为401,则抛出特定错误,这将触发handleTokenInvalid函数清除定时器。

        此外,请注意:

        替换'YOUR_ACCESS_TOKEN' 和 API 端点 URL 为实际值。
        对于生产环境的应用,应该考虑通过更安全的方式管理访问令牌,例如从环境变量加载或者使用身份验证库来自动刷新令牌。
        如果应用有刷新令牌的能力,可以在handleTokenInvalid中尝试刷新令牌而不是直接清除定时器。


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

相关文章:

  • 【Jave全栈】Java与JavaScript比较
  • Qt Ribbon使用实例
  • 02.05、链表求和
  • [牛客]公交线路(dijkstra+链式前向星)
  • 【shell工具】编写一个批量扫描IP地址的shell脚本
  • QT使用eigen
  • 【浏览器 - Chrome调试模式,如何输出浏览器中的更多信息】
  • 如何根据壁纸主题选择合适的主色调?
  • 对海康威视工业相机进行取图
  • 产业园管理系统提升企业综合管理效率与智能化水平的成功案例分析
  • 若依路由配置教程
  • 图像处理篇---图像压缩格式编码格式
  • 3.5.3 基于横盘结构的分析体系——缠论(线段)
  • 力扣-链表-24 两两交换链表中的节点
  • 16.Word:石油化工设备技术❗【28】
  • oracle 19C RAC打补丁到19.26
  • linux 环境安装 dlib 的 gpu 版本
  • HTML(快速入门)
  • WPS数据分析000010
  • Vue.js组件开发-Vue实现上传word模版打印设置自定义样式和布局
  • 【JAVA项目】基于ssm的【宠物医院信息管理系统】
  • 【论文阅读】Equivariant Diffusion Policy
  • 1.Template Method 模式
  • 【信息系统项目管理师-选择真题】2011下半年综合知识答案和详解
  • 软件测试 —— jmeter(2)
  • SpringBoot中Excel表的导入、导出功能的实现