如何让useEffet支持async/await

news2025/4/8 16:05:08

前言

刚开始学react写过类似下面的代码,就是想直接在useEffect中使用async/await。然后浏览器就会报错如下图:

useEffect(async () => {
    const res = await Promise.resolve({ code: 200, mes: '' });
  }, [])

在这里插入图片描述
报错的意思: useEffect 期望接受一个同步的函数作为参数,但 async 函数实际上返回的是一个 Promise。useEffect应该返回的是一个销毁函数,这里第一个参数使用了async,返回就是promise,会导致销毁函数报错。

react为什么这么做

我们都知道useEffect是很重要的一个hooks,可以执行一些副作用操作,它可以完成一些在class组件中一些生命周期函数的职责。如果返回值是异步的,那我们可能就无法预知代码的执行情况,很容易出现难以定位的bug,所以React就直接限制了useEffec回调函数中不支持async/await。

useEffect期望一个函数,而async () => {}返回的是一个Promise。这样的使用会造成不匹配,因为useEffect不支持直接返回Promise,它需要一个函数,且该函数可以返回另一个函数用于清理。

这就是为什么像useEffect(async () => {}, [])这样的用法会导致错误。JavaScript引擎会指出传递给useEffect的参数不符合其要求。

useEffect如何支持async/await

方式一:
可以在useEffect内部定义一个async函数,然后在其中使用async/await语法来处理异步操作。

useEffect(() => {
  const fetchData = async () => {
    try {
      const result = await someAsyncOperation();
      // 进行其他操作,比如更新 state
    } catch (error) {
      // 处理错误
    }
  };

  fetchData();

  // 你可以选择返回一个清除函数,如果需要清理操作的话
  return () => {
    // 清理操作
  };
}, [/* 依赖 */]);

注意,在useEffect内部定义一个async函数并不会改变useEffect的行为,它仍然会被当做同步操作处理。这里,我们只是利用了async/await语法来处理异步操作,但useEffect本身仍需遵循其原有的规则和生命周期。
方式二:
你可以直接在 useEffect 中使用 IIFE(立即调用函数表达式)来处理异步操作。这种方法可以让你在 useEffect 中立即执行异步函数。

useEffect(() => {
  (async () => {
    try {
      const result = await someAsyncOperation();
      // 处理结果
    } catch (error) {
      // 处理错误
    }
  })();

  // 可选:返回一个清理函数
  return () => {
    // 清理操作
  };
}, [/* 依赖 */]);

自定义useAsyncEffect 函数

当涉及到在useEffect中使用异步操作时,可以创建自定义的useAsyncEffect钩子函数,返回一个清理函数,类似于内置的useEffect。在异步操作结束后执行清理操作,这个自定义钩子可以管理异步逻辑并使其更清晰易用。

const useAsyncEffect = (effectFunction, cleanupFunction, dependencies) => {
  useEffect(() => {
    effectFunction();
    return cleanupFunction;
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, dependencies);
};

这样的话可以在调用 useAsyncEffect 时传入异步函数、清理函数和依赖项数组。在内部使用 useEffect,并确保在 useEffect 中返回清理函数,以便在组件卸载或依赖项变更时执行清理操作。

使用:

useAsyncEffect(
  async () => {
    try {
      const result = await fetchData();
      // 处理获取的数据
    } catch (error) {
      // 处理错误
    }
  },
  () => {
    // 执行清理操作
  },
  [/* dependencies */]
);

这种方式能够在传入异步操作和清理函数的同时,仍然利用 useEffect 的特性进行管理。
这useAsyncEffect只是一个简单的自定义封装,使用还需对useEffect内部逻辑的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1199081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FM模型与POLY2模型

两个核心细节 掌握FM&#xff0c;有两个细节需要注意&#xff1a;参数量级的变化和时间复杂度的变化。 首先对于参数量级&#xff0c;由线性模型到多项式模型到FM模型参数量级变化为&#xff1a; n–>n*n–>kn (k<<n) 其次是由原始FM公式到化简之后的FM公式复杂…

ArduPilot开源代码之Aocoda-RC F405V2 Mark4 7“ PNP适配

ArduPilot开源代码之Aocoda-RC F405V2 Mark4 10"适配 1. 源由2. 安装2.1 Installing Ground Station (GCS) software2.2 Autopilot System Assembly Instructions2.3 Loading Firmware2.4 Connect Mission Planner to AutoPilot 3. 配置3.1 Basic System Overview3.2 Fram…

头歌答案--数据持久化(非数据库)

目录 ​编辑 数据持久化&#xff08;非数据库&#xff09; 第1关&#xff1a;数据持久化&#xff08;非数据库&#xff09; 任务描述 多线程、多进程爬虫 第1关&#xff1a;多线程、多进程爬虫 任务描述 Scrapy爬虫基础 任务描述 MySQL数据库编程 第1关&#xff1a;…

如何删除英文键盘ENG

1.打开设置&#xff1a;时间和语言2.选择语言&#xff0c;查看首选列表&#xff0c;如果有多种语言&#xff0c;删除其他的语言就可以&#xff0c;如果只有中文&#xff0c;需要点击添加语言 3.选择安装的语言 这个时候点击英语&#xff0c;在选项中就可以看到它的默认键盘&…

盘点双11!阿里妈妈助这些品牌短视频赢增长!

刚刚&#xff01;一年一度的双11落下帷幕&#xff0c;很多新变化值得回味。 尽管天气在变凉&#xff0c;但市场出现了逐渐回暖的迹象。在此背景下&#xff0c;大量商家特别关心如何在双11打一场漂亮的胜仗。 卖方如何行动&#xff0c;关键在于买方的变化。在阿里妈妈发布的《…

小H靶场学习笔记:DC-2

DC-2 Created: November 10, 2023 3:01 PM Tags: WordPress, git提权, rbash逃逸 Owner: 只会摸鱼 靶场过程 信息收集 扫描存活主机&#xff0c;找到靶机ip&#xff1a;192.168.199.131&#xff08;本机是192.168.199.129&#xff09; 扫描端口开放协议 发现有80端口和77…

通过 Elasticsearch 和 Go 使用混合搜索进行地鼠狩猎

作者&#xff1a;CARLY RICHMOND&#xff0c;LAURENT SAINT-FLIX 就像动物和编程语言一样&#xff0c;搜索也经历了不同实践的演变&#xff0c;很难在其中做出选择。 在本系列的最后一篇博客中&#xff0c;Carly Richmond 和 Laurent Saint-Flix 将关键字搜索和向量搜索结合起…

第23章(下)_索引原理剖析

文章目录 索引实现索引存储B树为什么 MySQL InnoDB 选择 B 树作为索引的数据结构&#xff1f;B 树层高问题关于自增id最左匹配原则覆盖索引索引下推innodb体系结构Buffer poolchange buffer 总结 索引实现 索引存储 innodb 由段、区、页组成。段分为数据段、索引段、回滚段等…

手把手带你创建一个自己的GPTs

大家好&#xff0c;我是五竹。 最近GPT又进行了大升级&#xff0c;这一下又甩了国内AI几条街&#xff0c;具体更新了哪些内容之前的一篇文章中其实已经说过了&#xff1a;ChatGPT 王炸升级&#xff01;更强版 GPT-4 上线&#xff01; 其中最重要的一点就是支持自定义GPT&…

【博士每天一篇文献-算法】Imposing Connectome-Derived Topology on an Echo State Network

阅读时间&#xff1a;2023-11-5 1 介绍 年份&#xff1a;2022 作者&#xff1a;Jacob Morra, Mark Daley 西部大学 期刊&#xff1a;2022 International Joint Conference on Neural Networks (IJCNN) 引用量&#xff1a;3 研究了果蝇连接图的拓扑结构对混沌时间序列预测中回…

IP-guard Webserver view 远程命令执行漏洞【2023最新漏洞】

IP-guard Webserver view 远程命令执行漏洞【2023最新漏洞】 一、漏洞描述二、漏洞影响三、漏洞危害四、FOFA语句五、漏洞复现1、手动复现yaml pocburp发包 2、自动化复现小龙POC检测工具下载地址 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传…

代码随想录算法训练营第18天|513. 找树左下角的值 112. 路径总和 113.路径总和ii 106.从中序与后序遍历序列构造二叉树

JAVA代码编写 513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7提示: 二叉树的节点个…

Vue.js 学习总结(3)—— vite 打包图片时报错 Rollup failed to resolve import...

问题 图片依赖&#xff1a; Vite 打包前端项目时图片无法引入&#xff0c;报如下错误&#xff1a; ERROR [vite]: Rollup failed to resolve import "%7BlibeiDanmuKongmu%7D" from "D:/java/workspace/jeecgboot-vue3/src/views/funeral/tombInfo/area.vue?…

《数据结构、算法与应用C++语言描述》-队列的应用-工厂仿真

工厂仿真 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_19Factory simulation/ 问题描述 一个工厂有m台机器。工厂的每项任务都需要若干道工序才能完成。每台机器都执行一道工序&#xff0c;不同的机器执行不同的工序。一台机器一…

13年测试老鸟,稳定性测试要点+性能监控关键指标分析(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、稳定性测试的要…

FlinkSQL聚合函数(Aggregate Function)详解

使用场景&#xff1a; 聚合函数即 UDAF&#xff0c;常⽤于进多条数据&#xff0c;出⼀条数据的场景。 上图展示了⼀个 聚合函数的例⼦ 以及 聚合函数包含的重要⽅法。 案例场景&#xff1a; 关于饮料的表&#xff0c;有三个字段&#xff0c;分别是 id、name、price&#xff0…

录制GIF图,动态图

软件下载链接&#xff1a; https://www.cockos.com/licecap/ 参考链接&#xff1a; https://chat.xutongbao.top/

<C++> stack queue模拟实现

目录 前言 一、stack的使用 1. 接口说明 2. 例题 二、模拟实现stack 三、queue的使用 四、模拟实现queue 五、deque 总结 前言 LIFO stack 1. 栈是一种容器适配器&#xff0c;专门设计用于在后进先出上下文&#xff08;后进先出&#xff09;中运行&#xff0c;其中元素仅从容器…

Linux之基本指令操作

1、whoami whoami&#xff1a;查看当前账号是谁 2、who who&#xff1a;查看当前我的系统当中有哪些用户&#xff0c;当前有哪些人登录了我的机器 3、 pwd pwd&#xff1a;查看我当前所处的目录&#xff0c;就好比Windows下的路径 4、ls ls&#xff1a;查看当前目录下的文件信…

搭建Docker

一、概念 云服务器大家肯定不陌生了&#xff0c;相比较传统物理服务器来说他的价格&#xff0c;个性化的配置服务&#xff0c;节省了很多的运维成本&#xff0c;越来越多的企业以及个人开发者更加的青睐于云服务器。有了属于自己的服务器就可以部署搭建自己个人网站了&#xf…