【发布时间】:2018-12-12 03:14:04
【问题描述】:
我有一个从cDM 调用的箭头函数,以使用setTimeout() 每20 秒检索一次计划的更新状态。
componentDidMount() {
//get request to /schedules
//update state with response data
this.getUpdatedStatus();
}
/schedules 上的每个时间表如下所示:
"data": {
"id": "2147483605",
"selfUri": "/schedules/2147483605",
"type": "Schedule",
"status": "Pending",
}
所以在下面的方法中,每个schedule.selfUri 都被请求,我正在尝试更新每个计划的status。
getUpdatedStatus = () => {
//fetch updated status,
const schedules = this.state.schedules;
Promise.all(
schedules.map(schedule =>
axios({
method: "get",
url: schedule.selfUri,
})
)
)
.then(response => {
console.log(response);
const isIncomplete = response.some(r => r.status !== "Complete");
console.log(isIncomplete);
if (isIncomplete) {
this.timeout = setTimeout(() => this.getUpdatedStatus(), 20000);
}
this.setState(
{
scheduleStatus: isIncomplete ? "Pending" : "Complete",
},
() => {
console.log(this.state.scheduleStatus);
console.log(this.state.schedules);
}
);
})
.catch(error => console.log(error.response));
};
setTimeout 函数正在工作,并且每 20 秒请求一次检索可能的状态更新。对象响应最终返回complete 的状态,但该值未在我的表中重新呈现。我相信我的承诺链存在问题,使用 setTimeout 完成时不会更新我的 this.state.scheduleStatus。我附上了一个代码框,可以更好地了解我的问题。
【问题讨论】:
-
你能提供显示问题的工作小提琴吗? jsfiddle.net
-
您应该做的第一件事是将
<fieldset>包装在<form>元素中。这将允许 React 正确控制表单元素。接下来,似乎组件没有正确安装。 -
接下来,您没有将
scheduleStatus声明为状态属性,而是尝试使用它。所以将scheduleStatus声明为状态属性。最后,Axios 调用返回的数据是一个 HTML 页面...不是数据。 -
我认为问题实际上可能出在“const isIncomplete = response.some(r => r.status !== "Complete");"这似乎是在查看 response.status,即 http 状态。由于这始终是一个 http 状态代码,它永远不会等于“完成”,因此始终返回 true。
-
@RyanGibbs 你和我得出了完全相同的结论 :)
标签: javascript reactjs promise