ckinmind/hackernews-react

ajax引发的问题(组件销毁前需要清除未完成的请求)

ckinmind opened this issue · 4 comments

在组件切换的时候发现一个问题,经常报如下的错误:

Warning: setState(...): Can only update a mounted or mounting component. 
This usually means you called setState() on an unmounted component. This is a no-op.

我猜测可能的原因是,因为页面的ajax请求还没完全结束就切换了页面,原页面的组件被销毁但是ajax请求没有清除,导致在新的页面继续响应了原ajax请求,处理思路应该是添加生命周期函数componentWillUnmount,在其中清除未完成的ajax

本问题和issue #4 有关,且上一楼的描述不是很合理,新的描述如下

出现这样的问题是因为本项目原来是ES5写的,改成ES6写法之后isMounted()方法就失效了,这个方法是在ajax里调用的,用来防止这种情况:ajax请求还未完成,结果由于页面切换导致组件被销毁,但是ajax请求没被销毁,还是响应了,而一般ajax回调中都有setState, 但是因为组件被销毁了,所以报错会提示setState需要组件是mounted状态。为了防止这种状况可以使用isMounted()方法判断,如果为false就不要执行下去了,ES6写法里没有这个函数可以自己写一个维护状态,在compnentWillUnMount里改变

可不可以直接关闭未返回的请求?

@sunriseLix 可以的,jQuery中有abort方法可以取消ajax请求,你可以了解一下

好的,谢谢