作者:蓝色的秋风

转发链接:https://mp.weixin.qq.com/s/Sedap5_fszLuw3PMkvzFeQ

前言

大家好 !

今天,让我们看一下在 React Hooks 中使用 fetch 和Abort Controller取消Web请求从而来避免内存泄露!

当我们用 Fetch 来管理数据时,有时我们想取消请求(例如,当我们离开当前页面时,当我们关闭模态框,...)。

在下面的示例中,我们要在切换路由的时候获取并展示数据。但是,我们在获取数据完毕之前就离开了路由/页面。

我们刚刚看到了一个内存泄漏!让我们看看为什么会出现这个错误,以及它的具体含义。

❓为什么有内存泄漏?:我们有一个执行异步fetch(url)任务的组件,然后更新该组件的状态来显示元素,但是我们在请求完成之前就卸载(unmounted)了该组件。由于已卸载组件的状态(例如 setUsers,setState)被更新, 所以造成了此次内存泄露

让我们使用新的 AbortController API!

Abort Controller 允许您订阅一个或多个Web请求,并具有取消请求的能力。

现在,我们可以访问controller.signal。

“ 具有 read-only属性的 AbortController接口返回一个AbortSignal (https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) 对象实例,该实例可用于根据需要与DOM请求通信/终止它。” 来自MDN(https://developer.mozilla.org/en-US/docs/Web/API/AbortController)

让我们看看如何使用它

最后,如果我们想取消当前请求,只需调用abort()。另外,你可以获取controller.signal.aborted,它是一个只读属性,它返回一个Boolean表示与DOM通讯的信号是(true)否(false)已被放弃。

❗️注意:调用abort()时,fetch() promise 会以名为AbortError 的 DOMException reject。

是的,你刚刚学习了如何取消Web请求!

让我们用React Hooks做到这一点!

改造之前

下面是一个组件示例,它请求数据并展示它们。

如果我们离开页面的速度太快而导致请求未完成:MEMORY LEAK

改造之后

我们使用 useEffect 来订阅我们的 fetch 请求来避免内存泄漏。当组件卸载(unmounted)时,我们使用useEffect的清理方法来调用abort()。

现在,不再有内存泄漏!

你可以在 https://abort-with-react-hooks.vercel.app/ 上查看此演示。

可以在 https://github.com/hua1995116/node-demo/react-abort 查看源码

干杯

作者:蓝色的秋风

转发链接:https://mp.weixin.qq.com/s/Sedap5_fszLuw3PMkvzFeQ

http请求中必备的字符段_React Hooks中这样写HTTP请求可以避免内存泄漏相关推荐

  1. python访问字符串中的部分字符的操作_python中字符串的常见操作方法

    1. 字符串概念,字符串是一个容器,包含若干个字符并按照一定的顺序组织成一个整体.字符串支持索引操作. 2. 创建字符串基本语法 变量名 = "字符串信息" 变量名 = '字符串信 ...

  2. html中如何屏蔽一段代码,html中如何使用python屏蔽一些基本功能(示例代码)

    进行数据解析的理由不计其数,相关的工具和技巧也同样如此.但是,当您需要用这些数据做一些新的事情时,即使有"合适的"工具可能也是不够的.这一担心对于异类数据源的集成同样存在.用来做这 ...

  3. C语言中如何输出字符的编码,GB2312中汉字字符的编码在C语言中的输出测试

    C语言中ASCII编码表中每一个字符对应的编码,与数字其实是完全一样的. printf("%d\n",1);          对应的输出是1 printf("%c\n& ...

  4. 利用classloader同一个项目中加载另一个同名的类_线程上下文类加载器ContextClassLoader内存泄漏隐患...

    前提 今天(2020-01-18)在编写Netty相关代码的时候,从Netty源码中的ThreadDeathWatcher和GlobalEventExecutor追溯到两个和线程上下文类加载器Cont ...

  5. react取消所有请求_React Hooks中取消HTTP请求来避免内存泄漏

    大家好 !

  6. ios去掉字符串中的某个字符_iOS 截取字符串中两个指定字符串中间的字符串方法...

    例如,要截取一个字符串中,两个指定字符串中间的字符串,OC截取方法如下: // 要截取 "> 和 之间的汉字内容: @implementation ViewController - ( ...

  7. java中全大写字符_Java 大写字符串中的字符

    public class ComputeInitials { public static void main(String[] args) {/**时 代 J a v a 公 众 号 - nowjav ...

  8. C语言 —— 获取字符串中两个字符之间的的数据

    问题描述:获取字符串中两个字符之间的数据.最近写SMTP代理,需要获取发送方与接收方的邮件名称. 字符串为 "MAIL FROM:<test1@163.com>\r\n" ...

  9. 每天一道LeetCode-----在字符串s中找到最短的包含字符串t中所有字符的子串,子串中字符顺序无要求且可以有其他字符

    Minimum Window Substring 原题链接Minimum Window Substring 要求在源字符串s中找到长度最短的子串,这个子串包含目标字符串t中的所有字符,字符顺序没有要求 ...

最新文章

  1. String和StringBuilder、StringBuffer的区别?
  2. Android的Recovery中font_10x10.h字库文件制作
  3. 什么是卷影复制,卷影服务是什么
  4. linux学习总结--linux100day(day1)
  5. 机械制图及计算机绘图技能实训,机械制图测绘与CAD技能实训(二)
  6. mysql gtid ha_MySQl新特性 GTID
  7. 小程序引发的深层思考
  8. java设置只有一行表格,为什么我的表格插入一行后 样式都变了?是因为没有设置css吗?如果在java函数中插入的td.innerHTML = input type='text'/,可以设置样...
  9. BZOJ 2836 树链剖分+线段树
  10. php操作mysql工具类_PHP操作数据库的工具类
  11. Feem(局域网文件传输工具)官方版
  12. 第四方支付跟第三方支付的区别,支付源码有什么用
  13. spring-cloud 出现 No instances available for xxx的问题
  14. 2018年年底PC浏览器使用率
  15. MATLAB Appdesigner开发独立桌面App全流程(一):以打开串口功能为例介绍Appdesigner的基本使用
  16. PyBullet快速上手教程
  17. StrangIOC框架一
  18. 百度终于要出手了?文心一言
  19. wx.createSelectorQuery() 获取节点信息 获取不到解决方法
  20. 玩转Linux之dd命令操作详解

热门文章

  1. OpenGL 法线贴图 切线空间 整理
  2. 流氓百度乱发短信的经历
  3. 分类整理我在SF上针对某些问题作的回答
  4. php正则如何使用 1,PHP正则表达式使用详解(1)
  5. cmake 生成mysql_采用cmake方式编译安装MySQL
  6. 深度学习中的损失函数如何画图_如何用深度学习来做检索:度量学习中关于排序损失函数的综述(1)...
  7. Pycharm常见问题
  8. pdo mysql连接类_PHP PDO-MYSQL:如何在不同类之间使用数据库连接
  9. word 2007如何插入参考文献引用
  10. 联通g网java业务的是什么_联通发力G网增值业务