是的,这是 React 中的一种反模式。可能this.setState({ results: res.results })
会在组件卸载后执行。
最好的方法是将状态(搜索挂起/搜索已解决)移出react组件。您可以利用redux
+redux-thunk
或mobx
或flux
来帮助您。对于简单的情况,您可以构建可取消的Promise。
const makeCancelable = (promise) => {
let hasCanceled_ = false;
const wrappedPromise = new Promise((resolve, reject) => {
promise.then(
val => hasCanceled_ ? reject({isCanceled: true}) : resolve(val),
error => hasCanceled_ ? reject({isCanceled: true}) : reject(error)
);
});
return {
promise: wrappedPromise,
cancel() {
hasCanceled_ = true;
},
};
};
class MyComponent extends Component {
componentDidMount() {
this.cancellableSearch = makeCancelable(this.props.doSearch());
this.cancellableSearch.then((res) => {
this.setState({ results: res.results });
}).catch((reason) => {
if (!isCanceled.isCanceled) {
console.error('some error occurs', reason);
}
})
}
componentWillUnmount() {
this.cancellableSearch.cancel();
}
// ...
}
可取消的Promise代码从这里复制:https : //facebook.github.io/react/blog/2015/12/16/ismounted-antipattern.html