如何让useEffet支持async/await

前言

刚开始学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内部逻辑的理解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法导论笔记5:贪心算法

P216 第15章动态规划 最优子结构 具有它可能意味着适合应用贪心策略 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法。 剪切-粘贴技术证明 每个子问题的解就是它本身的最优解(利用反证法&#xff0…

CCC数字钥匙设计 --数字钥匙数据结构

1、数字钥匙是什么? 汽车数字钥匙,将传统实体钥匙数字化,用卡片、手机等智能设备来做数字钥匙的载体。 从而实现无钥匙进入/启动、为他人远程钥匙授权、个性化的车辆设置等功能。 目前市场上流行的数字钥匙方案是通过NFC、BLE、UWB通信技术…

【数据库开发】DataX开发环境的安装部署

文章目录 1、简介1.1 DataX简介1.2 DataX功能1.3 支持的数据通道 2、DataX安装配置2.1 DataX2.2 Java2.3 Python2.4 测试 3、DataX Web安装配置3.1 mysql3.2 DataX Web3.2.1 简介3.2.2 架构图3.2.3 依赖环境3.2.4 安装 结语 1、简介 DataX是阿里云DataWorks数据集成的开源版本。…

考研分享第2期 | 中央财经大学管理科学跨考北大软微金融科技406分经验分享

一、个人信息 本科院校:中央财经大学 管理科学与工程学院 管理科学专业 上岸院校:北京大学 软件与微电子学院 金融科技专业硕士 考试科目: 初试:思想政治理论 英语一 数学二 经济学综合 面试考察范围广,包括英语自…

深度学习1【吴恩达】

视频链接:1.5 关于这门课_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1FT4y1E74V?p5&spm_id_frompageDriver&vd_source3b6cdacf9e8cb3171856fe2c07acf498 视频中吴恩达老师所有的话语收录: 机器学习初学者-AI入门的宝典 (ai-start.c…

CorelDRAW2023中文免费版矢量图设计软件

设计工作经验丰富的人一定对比过多种设计软件,在对众多矢量图设计软件进行对比之后,多数资深设计师认为CorelDRAW的专业性、便捷性以及兼容性的综合表现更好,而且软件还配置了海量艺术笔,这让工作成果更为出众,因此更愿…

Clickhouse学习笔记(8)—— 建表优化

数据类型 时间字段 建表时能用数值型或日期时间类型(DateTime)表示的字段就不要用字符串 因为clickhouse进行分区时一般使用时间字段来进行分区,而将时间字段使用DateTime表示,不需要经过函数转换处理,执行效率高、…

[Android]_[初级]_[配置gradle的环境变量设置安装位置]

场景 在开发Android项目的时候, gradle是官方指定的构建工具。不同项目通过wrapper指定不同版本的gradle。随着项目越来越多,使用的gradle版本也增多,导致它以来的各种库也增加,系统盘空间不足,怎么解决? 说明 grad…

.Net-C#文件上传的常用几种方式

1.第一种上传方式,基本通用于.net所有的框架 [HttpPost][Route("Common/uploadFile1")]public string uploads(){HttpContextBase context (HttpContextBase)Request.Properties["MS_HttpContext"];//获取传统contextHttpRequestBase request context.Re…

CUMT-----Java课后第六章编程作业

文章目录 一、题11.1 问题描述1.2 代码块1.3 运行截图 二、题22.1 问题描述2.2 代码块2.3 运行截图 一、题1 1.1 问题描述 (1)创建一个用于数学运算接口,算数运算加、减、乘和除都继承该接口并实现具体的算数运算。(2)编写一个测试类进行运行测试。 1.2 代码块 p…

服务器中了locked勒索病毒怎么处理,locked勒索病毒解密,数据恢复

近几年,网络应用技术得到了迅速发展,越来越多的企业开始走向数字化办公,极大地为企业的生产运营提供了帮助,但是网络技术的发展也为网络安全埋下隐患。最近,locked勒索病毒非常嚣张,几乎是每隔两个月就会对…

美团2024届秋招笔试第二场编程真题-小美的数组构造

分析:暴力角度看,因为数组a和b总和一样,所以实际上是将总和m划分为n个数字,且每个数字都和a数组不一样的方案数。当然会超时。从数据角度看,平方级别算法是可以的。 其实用动态规划的四步法分析起来还是很简单的&…

Python实战 | 使用 Python 和 TensorFlow 构建卷积神经网络(CNN)进行人脸识别

专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https:/…

EXCEL中将UTC时间戳转为日期格式(精确到秒)

UTC时间戳的格式通常是一个整数,表示从1970年1月1日00:00:00 UTC到当前时间的总秒数。它可以以秒或毫秒为单位表示。例如,如果当前时间是2023年3月17日 12:34:56 UTC,则对应的UTC时间戳为1679839496(以秒为单位)或1679…

通过防火墙禁止访问指定网站(个人电脑,Windows系统)

背景 近年沉迷B站视频不能自拔,使用了诸多手段禁用,都很容易破戒。为了彻底杜绝B站的使用,决定手动进行设置。在ChatGPT和文心一言提问,得到了以下四种方法(按个人认为的戒断水平由低到高排序):…

分享10个地推拉新和网推拉新app推广接单平台,一手接任务平台

文章首推平台:”聚量推客“ 官方邀请码000000 从事地推、拉新、推广这一类型的工作,是一定要有稳定的一手接单平台的,因为在瞬息万变的拉新推广市场中,很多APP应用的推广拉新存在周期性,有可能这个月还在的拉新项目&a…

STM32F407: CMSIS-DSP库的移植(基于库文件)

目录 1. 源码下载 2. DSP库源码简介 3.基于库的移植(DSP库的使用) 3.1 实验1 3.2 实验2 4. 使用V6版本的编译器进行编译 上一篇:STM32F407-Discovery的硬件FPU-CSDN博客 1. 源码下载 Github地址:GitHub - ARM-software/CMSIS_5: CMSIS Version 5…

开发知识点-Vue-Electron

Electron ElectronVue打包.exe桌面程序 ElectronVue打包.exe桌面程序 为了不报错 卸载以前的脚手架 npm uninstall -g vue-cli安装最新版脚手架 cnpm install -g vue/cli创建一个 vue 随便起个名 vue create electron-vue-example (随便起个名字electron-vue-example)进入 创建…

中国国内机场信息集成系统厂家现状情况

机场信息集成系统在本世纪初进入中国市场,早期的信息集成系统提供商以外企为主,后来国内企业迅速发展。但在2008年前,民航总局设立了机场信息系统的入门门槛,也就是需要民航空管工程及机场弱电系统建设资质要求,该要求…

MySQL 约束特殊查询

MySQL 约束&特殊查询 文章目录 MySQL 约束&特殊查询1. 数据库约束1.1 约束类型1.2 NULL约束1.3 NUIQUE:唯一约束1.4 DEFAULT:默认值约束1.5 PRIMARY KEY:主键约束1.6 FOREIGN KEY:外键约束1.7 CHECK约束 2. 表的关系2.1 一…