Axios 仅在自调用函数内调用一次(Internet Explorer)

IT技术 javascript reactjs internet-explorer axios
2021-05-26 06:05:21

我有一个函数,它每 2.5 秒调用一次自己来检查在后台运行的任务。get如果响应是错误,它会调用 axios 到一个 url,如果响应成功,我会停止该函数。

这在 Chrome 和 Mozilla 中完美运行,但由于某种原因它在 IE(版本 11)中不起作用。该函数无限调用自己,但是查看日志显示它只调用了axios一次,然后它一直res.data.err == "Task not ready"循环,即使后端的任务已经完成。

为什么不在 IE 上再次调用 axios?有什么我想念的吗?

checkProgress() { 
    axios.get(url.CHECK_UPLOAD_TASK, { params: { id: this.state.taskID} }).then(res => {
        if(res.data.success){
            this.setState({loading: false});
            //do something if successfully finished task
        } else {
            if(res.data.err == "Task not ready") {
                setTimeout(() => {
                    this.checkProgress();
                },2500);
            } else {
                this.setState({loading: false});
                // do something if task had an error
            }
        }
    });
}
2个回答

我在 InternetExplorer(11,Edge)上也遇到了类似的问题(虽然使用 fetch)来轮询服务。我发现使用“Pragma: no-cache”标头解决了它。

你可以试一试:

const config = {
    headers: { Pragma: 'no-cache'},
    params: { id: this.state.taskID }
}

呼叫应如下所示:

axios.get(url.CHECK_UPLOAD_TASK, config).then(...)

谢谢丹尼尔,那就太好了。这个对我有用。另一种解决方法是在axios.create里面定义如下,我们就可以正常使用了。测试了两种解决方案并且运行良好!

const api = axios.create({
  headers: { Pragma: 'no-cache' },
});

当然你必须使用 api.get(...) 而不是 axios.get(...)。

希望能帮助到你!