我有一个页面,里面有一个componentDidMount()。我们有API调用,但是,如果在解决这些调用之前将这些调用导航到别处,则会得到反应错误。不能在未挂载的组件上使用setState。因此,我使用了Axios cancelToken来取消componentWillUnmount()中的API调用。它正在工作,API调用正在被取消。
但是,如果您将导航移开,然后返回到同一个页面,我将看到这些API调用仍然被取消,并且没有得到解决。也许我用错误的方式实现了cancelToken,或者是否有办法“取消”这些呼叫?
下面是代码框:axios cancelToken示例
发布于 2018-11-16 09:20:09
问题是创建在文件级别范围内创建的取消令牌。因此,在第一次生成它之后,每次都不发出请求就会取消请求。
const signal = CancelToken.source();
class Roster extends React.Component {
...........
}因此,删除了在类signal之前声明并包含在Roster组件的构造函数中的const Roster。
我修改了从示例代码中提取的Roster组件的代码,如下所示:
import React from "react";
import axios, { CancelToken } from "axios";
import request from "./api";
class Roster extends React.Component {
constructor() {
super();
this.state = {
data: null,
error: null
};
this.signal = CancelToken.source();
}
componentDidMount() {
request({ url: "google.com", method: "GET", cancelToken: this.signal })
.then(data => this.setState({ data }))
.catch(error => {
if (axios.isCancel(error)) {
this.setState({ error: "request cancelled" });
}
});
}
componentWillUnmount() {
this.signal.cancel();
}
render() {
const { data, error } = this.state;
return (
<div>
<div>data: {data ? data : "no data"}</div>
<div>error: {error ? error : "no error"}</div>
</div>
);
}
}
export default Roster;https://stackoverflow.com/questions/53334418
复制相似问题