1、写在后面
本篇文章旨在解释react异步申请内存透露问题的起因,以及对AbortController应用摸索,欢送各位童鞋一起摸索交换。
2、怎么会这样,why((灬ꈍ ꈍ灬))
常常用react开发我的项目的小伙伴应该常常碰到这种问题,即一个弹出框或者一个组件被另外一个组件立刻销毁,但被销毁或者敞开的弹出框外部可能正在某种申请中(申请示意:这不能怪我啊,我还没回城呢,你却拆了我家,嘤嘤嘤~~),这时销毁了组件,但申请还在路上,申请的回调还没开释,这就导致了内存透露。
3、AbortController
咋个办呢,用一个变量存贮是否行将销毁?willUnmount时setState为true?为true时做一些操作?。。。
貌似不怎么行呀,曾经在途中的申请怎么召回?class组件能够应用生命钩子,但hooks呢,没有钩子,Fetch,axios如同也都只返回promise,当然rxjs能够(subscribe返回句柄,能够在effect下return unsubscribe),但rxjs团队学习老本比拟高,比拟少用。怎么办呢?
AbortController对象实现了能够与申请通信的接口,通过它咱们能够显示的停止申请。
属性:AbortController.signal 一个AbortSignal对象,咱们能够拿着它与request对话或者停止它
Returns an AbortSignal object instance, which can be used to communicate with, or to abort, a DOM request.
办法:AbortController.abort 在一个申请实现前停止它
Aborts a DOM request before it has completed. This is able to abort fetch requests, consumption of any response bodies, and streams.
应用(how to use)
Wow, It's seem Ok!
如同能够了,销毁了申请也被停止了,回调更改react状态也停止,不错。
然而大家不知发现什么问题没有,每一个申请都如此解决是否太麻烦?一个AbortController的signal是否能管制多个申请,还是像promise一样状态凝固?
所以,让咱们来测试一下
测试后果:AbortConntroller的abort存在和promise一样的问题,一旦状态凝固,再应用这个实例signal的申请将间接回绝
优化
大家应用react开发我的项目,必定就是工程化我的项目,不止一个中央应用申请,一个个去写逻辑必定不事实,但设计AbortController的单例模式显然不适合。在那axios封装request办法的时候用工厂模式生成AbortController,并在返回的promise上减少属性,让使用者拿到控制器。