[React.js]组件卸载如何自动取消异步请求

本文介绍了如何在React组件卸载时自动取消fetch异步请求,通过实现类似Node.js的Emitter类和AbortController,结合abortable-fetch函数,使组件能够监听并触发abort事件来中断请求,确保组件生命周期的正确管理。
摘要由CSDN通过智能技术生成

背景介绍

某次路过同事的工位,刚好看到同事在写面试评价,看到里面有一个问题:组件卸载时自动取消异步请求问题,不及格。

我:???

现在fetch已经支持手动abort请求了吗?

于是上网去查各种资料:how to abort fetch http request when component umounts

然后得到的各种各样的资料里面,看起来比较靠谱的是这样一种:

componentDidMount(){
  this.mounted = true;

  this.props.fetchData().then((response) => {
    if(this.mounted) {
      this.setState({ data: response })
    }
  })
}

componentWillUnmount(){
  this.mounted = false;
}
复制代码

我:????

就这样吗?

然而这个写法并没有真的abortfetch请求,只是不去响应fetch成功之后的结果而已,这完全没有达到取消异步请求的目的。

于是我去问了问同事,如何真正abort掉一个已经发送出去的fetch请求。

同事跟我说:现在浏览器还不支持abortfetch请求。

我:……

同事继续:不过我们可以通过Promise.race([cancellation, fetch()])的方式,在fetch真正结束之前先调用cancellation方法来返回一个reject,直接结束这个Promise,这样就可以看似做到abort掉一个正在发送的fetch,至于真正的fetch结果是怎么怎样的我们就不需要管了,因为我们已经得到了一个reject结果。

我:那么有具体实现方法的wiki吗?

同事:我们代码里面就有,你去看看就行。

我:……(我竟然不知道!)

于是我就连读带问,认真研读了一下组件卸载自动取消异步请求的代码。

实现

整个代码的核心部分确实是刚才同事提到的那一行代码:return Promise.race([cancellation, window.fetch(input, init)]);

不过这里的cancellation其实是另一个Promise,这个Promise负责注册一个abort事件,当我们组件卸载的时候,主动触发这个abort事件,这样最后如果组件卸载之前,fetch请求已经响应完毕,就走正常逻辑,否则就因为我们触发了abort事件返回了一个reject的响应结果。


const realFetch = window.fetch;
const abortableFetch = (input, init) => {
    // Turn an event into a promise, reject it once `abort` is dispatched
    const cancellation = new 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值