react实多并发请求同步处理封装

简介: react实多并发请求同步处理封装

在React中处理多并发请求并实现同步处理(如等待所有请求完成后再执行后续操作)是常见需求。以下是一个通用的多并发请求同步处理封装方案,结合React的useEffectPromise特性实现:

1. 核心封装函数:处理多请求同步

/**
 * 同步处理多个并发请求
 * @param {Array<() => Promise>} requestList - 请求函数数组(每个函数返回Promise)
 * @param {Function} onSuccess - 所有请求成功后的回调(参数:所有请求结果数组)
 * @param {Function} onError - 任何一个请求失败后的回调(参数:错误信息)
 * @param {boolean} immediate - 是否立即执行(默认true)
 * @returns {() => void} - 手动执行请求的函数
 */
const useConcurrentRequests = (
  requestList,
  onSuccess,
  onError,
  immediate = true
) => {
   
  // 执行所有请求的函数
  const executeRequests = async () => {
   
    try {
   
      // 使用Promise.all并发执行所有请求,等待全部完成
      const results = await Promise.all(requestList.map(req => req()));
      onSuccess?.(results); // 所有请求成功后回调
    } catch (error) {
   
      onError?.(error); // 任何一个请求失败则触发错误回调
    }
  };

  // 立即执行(根据immediate控制)
  React.useEffect(() => {
   
    if (immediate) {
   
      executeRequests();
    }
  }, [immediate]); // 依赖项:仅immediate变化时重新执行

  return {
    executeRequests };
};

2. 使用示例:在组件中调用

import React, {
    useState } from 'react';
import axios from 'axios'; // 假设使用axios发送请求

const MyComponent = () => {
   
  const [loading, setLoading] = useState(false);
  const [data, setData] = useState(null);
  const [error, setError] = useState(null);

  // 1. 定义单个请求函数(返回Promise)
  const request1 = () => axios.get('/api/data1');
  const request2 = () => axios.get('/api/data2');
  const request3 = () => axios.get('/api/data3');

  // 2. 处理所有请求成功的回调
  const handleSuccess = (results) => {
   
    setLoading(false);
    // results是所有请求的响应数组,按请求顺序排列
    setData({
   
      data1: results[0].data,
      data2: results[1].data,
      data3: results[2].data,
    });
  };

  // 3. 处理请求失败的回调
  const handleError = (err) => {
   
    setLoading(false);
    setError(err.message || '请求失败');
  };

  // 4. 使用封装的钩子:传入请求列表和回调
  const {
    executeRequests } = useConcurrentRequests(
    [request1, request2, request3], // 请求函数数组
    handleSuccess,                  // 成功回调
    handleError,                    // 失败回调
    false                           // 不立即执行(手动触发)
  );

  // 手动触发请求
  const handleFetch = () => {
   
    setLoading(true);
    setError(null);
    executeRequests();
  };

  return (
    <div>
      <button onClick={
   handleFetch} disabled={
   loading}>
        {
   loading ? '加载中...' : '获取数据'}
      </button>
      {
   error && <div style={
   {
    color: 'red' }}>{
   error}</div>}
      {
   data && (
        <div>
          <p>数据1: {
   JSON.stringify(data.data1)}</p>
          <p>数据2: {
   JSON.stringify(data.data2)}</p>
          <p>数据3: {
   JSON.stringify(data.data3)}</p>
        </div>
      )}
    </div>
  );
};

export default MyComponent;

3. 扩展场景:处理部分失败的情况

如果需要等待所有请求完成(包括失败的),而不是一个失败就整体失败,可以使用Promise.allSettled替代Promise.all,修改核心函数如下:

// 改为使用Promise.allSettled(等待所有请求完成,无论成功失败)
const executeRequests = async () => {
   
  try {
   
    const results = await Promise.allSettled(requestList.map(req => req()));
    // 处理结果:区分成功和失败
    const successResults = [];
    const errorResults = [];
    results.forEach(result => {
   
      if (result.status === 'fulfilled') {
   
        successResults.push(result.value);
      } else {
   
        errorResults.push(result.reason);
      }
    });
    onSuccess?.(successResults, errorResults); // 同时返回成功和失败结果
  } catch (error) {
   
    onError?.(error);
  }
};

4. 核心特性说明

  • 并发执行:使用Promise.all(或allSettled)实现请求并发,提高效率
  • 同步处理:等待所有请求完成后再执行后续逻辑(成功/失败回调)
  • 灵活性:支持立即执行或手动触发(通过immediate参数控制)
  • 错误处理:统一捕获错误,避免单个请求失败导致整个流程中断(可按需选择allallSettled

这种封装方式适用于需要依赖多个接口数据的场景(如页面初始化加载多个独立数据、表单提交前的多接口验证等),结合React的状态管理可清晰处理加载、成功、失败三种状态。

目录
相关文章
|
4月前
|
人工智能 自然语言处理 安全
SOFA AI 网关基于 Higress 的落地实践
SOFA 商业化团队为满足客户 AI 业务的发展需求,基于开源 Higress 内核构建,推出了 SOFA AI 网关,专为 SOFA 场景深度优化、能力增强,是面向 AI 需求的智能网关解决方案。
375 28
|
4月前
|
SQL Java 数据库连接
除了JDBC,还有哪些常见的数据库访问技术?
除了JDBC,还有哪些常见的数据库访问技术?
402 2
|
存储 并行计算 算法
C++进程间通信之共享内存
C++进程间通信之共享内存
1564 0
|
4月前
|
Linux 应用服务中间件 nginx
Docker 部署 Rocky Linux 全流程教程
Rocky Linux是CentOS停更后的理想替代,与RHEL完全兼容,支持10年更新。结合Docker部署,可实现环境一致、轻量高效、快速迁移,适用于企业级服务与遗留系统迁移。本文详解从镜像拉取到多场景部署的全流程。
1008 4
|
4月前
|
开发框架 前端开发 .NET
最新ASP.NET Core Blazor简介和快速入门一(基础篇)
大家好,我是码农刚子。本篇文章介绍了ASP.NET Core Blazor的简介和基础语法。Blazor是微软推出的基于.NET的Web框架,支持C#构建交互式前端,无需JavaScript。提供Server、WebAssembly和Hybrid三种托管模式,分别适用于实时通信、离线运行与跨平台原生应用开发,实现全栈C#开发体验。
328 1
最新ASP.NET Core Blazor简介和快速入门一(基础篇)
|
4月前
|
存储 安全 Java
泛型在Java集合框架中的类型擦除机制是如何工作的?
泛型在Java集合框架中的类型擦除机制是如何工作的?
166 2
|
4月前
|
监控 算法 搜索推荐
JVM性能优化实战手册:从监控到调优策略
本文基于DataBuff监控数据,系统探讨JVM性能优化实战,涵盖监控体系构建、GC调优、内存与线程管理等关键策略。通过调整堆大小、启用G1回收器等参数优化,有效降低Full GC频次,提升应用稳定性,为Java性能调优提供可落地的实践指南。(238字)
|
4月前
|
存储 人工智能 JSON
揭秘 Claude Code:AI 编程入门、原理和实现,以及免费替代 iFlow CLI
本文面向对 AI Coding 感兴趣的朋友介绍 Claude Code。通过此次分享,可以让没有体验过的快速体验,体验过的稍微理解其原理,以便后续更好地使用。
1952 18
揭秘 Claude Code:AI 编程入门、原理和实现,以及免费替代 iFlow CLI
|
3月前
|
存储 缓存 固态存储
系统分区完全指南:多种方法实现专业磁盘管理
合理磁盘分区可提升搜索效率、增强容错性、优化性能并便于管理。建议分为系统盘与数据盘,Windows推荐GPT格式,支持更大容量与UEFI启动。可通过系统自带工具或DiskGenius进行分区操作,注意备份、4K对齐及电源稳定。
870 3